關於使用由CA機構(EJBCA)頒發的證書實現SLLSocket雙向認證服務端報null cert chain的解決方案

Franson發表於2016-06-06

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證書自動匯入到客戶端證書庫的功能。

SSLSocket雙向認證通訊示例(含證書庫及證書).zip

相關文章