如何加载额外的不信任证书到SSL_CTX

问题描述:

我有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的证书,以形成证书链。

请参考与SSL/TLS协议相关的RFC(其中一个是here)。 通常,服务器应该发送证书的链,其中根CA可以可选地省略。客户端应该信任受信任的根并拥有证书。

但是,您可以省略链(除了客户端有证书链)。您需要确保应验证服务器证书。

您可以使用您拥有的链或者检查SSL_CTX_set_cert_verify_callback来进行后连接验证。

+0

感谢您的回答。还有一个问题:我将server_signing_ca的证书添加到客户端可信存储区。服务器端根本没有server_signing_ca的证书。有用。但我想知道这是标准允许的吗?这是最佳做法吗?我记得“只有自签名的证书才可以在可信的证书存储区中” –

+0

@JohnCrane:根据标准,只有最上面的根CA可以从链中省略。我不确定最佳做法。您的根目录可信CA(如Verisign)的可信自签名证书位于可信任的证书存储区中。但是,用户根据自己的风险可以根据选择添加其他证书。唯一需要的是客户端必须能够验证服务器的身份,而不会引发任何异常。 – doptimusprime