天天看點

如何使用Windows IIS頒發的證書生成Netty SocketIO支援SSL所需要的JKS密鑰庫?

大體背景是,同一機器上Windows IIS的Web服務和基于Netty SocketIO的WebSocket服務都需要支援SSL功能。

一開始兩個服務是不同團隊開發,于是分别各自生成支援SSL所需要的證書和密鑰庫。IIS這邊隻需要頒發證書,而Netty SocketIO這邊因為是Java開發,需要通過keytool生成密鑰庫檔案和證書。

後來在一起內建部署後,測試發現需要導入兩次證書,對使用者很不友善。

于是想到既然在一個機器上部署,能不能兩個服務共用一個證書。

由于IIS哥們有事請假半天,WebSocket團隊這邊最初的想法就是直接輕按兩下IIS生成的CER證書看看能不能導出keytool相容的格式,結果發現隻能導出DER/Base64編碼的X509(.CER)證書,或者PKCS#7(.P7B)證書。因為導出界面禁止了導出PKCS#12(.PFX)證書,折騰半天找不到辦法。後來IIS哥們回來告訴了正确的姿勢:1)打開IIS管理器;2)左側點機器名節點(比如,<Hostname> (<Hostname>\Administrator)),輕按兩下右邊的“伺服器證書”進入證書清單界面,選一個證書,點選滑鼠右鍵選“導出”即可以導出PFX格式檔案(比如myhostname.pfx)并設定保護密碼。

有了PFX檔案,那麼接下來簡單了,用keytool将其轉成JKS格式密鑰庫(比如keystore.jks):

keytool -importkeystore -srckeystore myhostname.pfx -destkeystore keystore.jks -srcstoretype PKCS12 -deststoretype JKS

最後,拷貝keystore.jks給WebSocket指定的密鑰庫目錄即可。

事後測試證明,使用者隻要安裝一個證書,就同時搞定Web服務和WebSocket服務的SSL功能。