Bouncy Castle 是產生 PEM file 非常好用的一個工具
官方網站:https://www.bouncycastle.org/
先來看一下 PEM 的檔案格式長什麼樣子
以下是一個 Https 網頁常見的簽證格式
Host:172.0.0.1 -----BEGIN CERTIFICATE----- www.abc.com.tw |
通常在網路上抓下來的簽證通常只會有 BEGIN 到 END 中間這個區塊的資料
在頁首及頁尾可辨視的資料較類似於註解功能
除非有特別協議在頁首或頁尾放驗證資料否則通常都是空的
對於一個 PEM 檔最重要的是 -----BEGIN CERTIFICATE----- 到 -----END CERTIFICATE----- 的部份
其中資料包含了驗證用的加密字串、CA 及 Server 的相關資訊
在程式設計中有時會需要存一些加密的檔案,像是 RSA Key、AES Key 等等
雖然 Key 在產生時也可以直接寫進檔案中,將它讀出來還是可以使用
但在資料交換時就必需跟對方說明你的檔案格式
那既然有一個公開的標準格式,那交換時就不用說明這麼多了,不用白不用啊
下面是利用 Bouncy Castle 產生 PEM 格式檔的程式
PemWriter pw = new PemWriter(new OutputStreamWriter(new FileOutputStream("File Path")));
PemObject po = new PemObject("TEST", data.getBytes());
pw.writeObject(po);
pw.close();
程式中的 "TEST" 字串其實就是上面 PEM 檔案內容的 "CERTIFICATE" ,這個部份是可以自訂的,內容不影響程式及驗證(不能換行)
另外也可以在 .writeObject 前後使用 .append(" ...... ") 加入頁首及頁尾
下面是讀取 PEM 格式檔的程式
PemReader pr = new PemReader(new InputStreamReader(new FileInputStream("File Path")));
PemObject po = pr.readPemObject();
pr.close();
取得之後就可以利用 .getHeader 及 .getContent 取得內容了
.getContent 取得的資料是不包含 -----BEGIN ......----- 及 -----END ......----- 的
另外 PemObject 在讀寫的時候都會自動做 Base64 的轉換
也就是說在轉 Base64 之前直接丟進 PemObject 就可以了
小心不要多轉了一次 Base64 導至資料不知道怎麼轉回來