在
SSLSocket實現服務端和客戶端雙向認證的例子
文章中最后提到使用keytool.exe的自簽證書實現雙向認證可以,但是使用ejbca生成證書實現SLL Socket的雙向認證是服務端老是報錯提示 null cert chain的錯誤。
當時花了一整天的時間研究都沒有眉目,今天突然想到,cert chain,證書鏈,查看客戶端或服務證書庫中的證書,含有除了自身的私匙外還有一個CA的公匙,如下圖所示:
終於明白了,原來要實現雙向認證,使用keytool.exe工具的-export命令除需要導出自身的公匙證書外,還需要導出含CA公匙的證書。整個步驟也就如下:
1.使用EJBCA系統創建客戶端實體,token為jks證書庫形式(主題DN信息參考其他文章),在create key store菜單中輸入用戶名密碼導出客戶端證書庫 ejbcaclient.jks;
2.使用EJBCA系統創建服務端實體,token為jks證書庫形式,在create key store菜單中輸入用戶名密碼導出服務端證書庫 ejbcaserver.jks;
3.使用keytool.exe工具的-export命令分別導出含有客戶端公匙的證書以及含有CA簽發機構公匙的證書 sslclient.crt,sslclientca.crt;
4.使用keytool.exe工具的-export命令分別導出含有服務端公匙的證書以及含有CA簽發機構公匙的證書 sslserver.crt,sslserverca.crt;
5.將客戶端證書和頒發客戶端證書的CA證書使用keytool.exe的-import命令導入至服務端證書庫 ejbcaserver.jks,使服務端在通信時信任客戶端,確認客戶端的身份;
6.將服務端證書和頒發服務端證書的CA證書使用keytool.exe的-import命令導入至客戶端證書庫 ejbcaclient.jks,使客戶端在通信時信任服務端,並確認服務端的身份;
7.代碼編寫SLLSocket通信demo測試雙向認證。
注意:
1.如果使用EJBCA系統在頒發客戶端和服務端證書的簽發機構為同一個機構,則在導入通信雙方證書時不需要導入含簽發機構CA公匙的證書,因為證書庫里面已經包含了此證書。
下面附上SSLSocket雙向認證通信的簡易測試代碼。此代碼中含 將服務端證書及CA證書自動導入到客戶端證書庫的功能。