2013-04-14 46 views
0

我有SSL客戶端和服務器,以及測試PKI這樣
如何加載額外的不信任證書到SSL_CTX

root_ca -> server_singing_ca -> ssl server 
     |--> client_signing_ca -> ssl client 
服務器

,我把服務器證書和server_signing_ca證書到同一個文件並加載文件使用

SSL_CTX_use_certificate_chain_file(). 

這是行得通的。不信任的中間證書在握手期間自動發送給客戶端。

我的問題是:我想在握手期間儘量減少數據交換。是否有辦法讓客戶事先持有server_signing_ca證書的副本,以便我可以從服務器端刪除它?
而且我不想將server_signing_ca的證書添加到可信存儲區。
客戶端加載server_signing_ca的證書的API是什麼?我看着

SSL_CTX_add_extra_chain_cert(). 

但現在看來,這是爲客戶端加載client_signing_ca的證書,以形成證書鏈。

回答

1

請參考與SSL/TLS協議相關的RFC(其中一個是here)。 通常,服務器應該發送證書的鏈,其中根CA可以可選地省略。客戶端應該信任受信任的根並擁有證書。

但是,您可以省略鏈(除了客戶端有證書鏈)。您需要確保應驗證服務器證書。

您可以使用您擁有的鏈或者檢查SSL_CTX_set_cert_verify_callback來進行後連接驗證。

+0

感謝您的回答。還有一個問題:我將server_signing_ca的證書添加到客戶端可信存儲區。服務器端根本沒有server_signing_ca的證書。有用。但我想知道這是標準允許的嗎?這是最佳做法嗎?我記得「只有自簽名的證書纔可以在可信的證書存儲區中」 –

+0

@JohnCrane:根據標準,只有最上面的根CA可以從鏈中省略。我不確定最佳做法。您的根目錄可信CA(如Verisign)的可信自簽名證書位於可信任的證書存儲區中。但是,用戶根據自己的風險可以根據選擇添加其他證書。唯一需要的是客戶端必須能夠驗證服務器的身份,而不會引發任何異常。 – doptimusprime