在SSL_connect上列出服务器提供的证书链

时间:2014-10-27 19:01:20

标签: security sockets visual-c++ openssl ssl-certificate

我是安全新手,因此可能会错误地使用某些术语:

  • 当我使用SSL_connect创建套接字连接时,服务器应该发送回整个证书链,以便验证服务器的真实性。
  • 为此,需要相应地配置服务器。
  • 如果服务器未发送回整个证书链且中间证书不在客户端证书存储中,则无法验证真实性。这会导致FireFox认为网站不安全的行为here
  • 我也读过some browsers are able to attain the intermediate certificate automatically。但是,OpenSSL的行为不是这样的,至少在默认情况下是这样。
  • 我也被告知,自几年前推出一些Windows更新以来,Windows证书库中已安装了一些(可能全部)中间证书。

我想查看服务器返回的证书,以验证我是否收回了整个证书链。这是我尝试过的:

  • 我正在使用SSLv3_method
  • SSL_CTX_set_verify使用SSL_VERIFY_NONE设置。
  • SSL_connect之后我使用SSL_get_peer_cert_chain来访问证书链。

考虑:

STACK_OF(X509)* certificateChain = SSL_get_peer_cert_chain(ssl);
while (char* stackCertificate = sk_pop(certificateChain))
{
  X509* certificate = (X509*)stackCertificate;
}

这是获取证书链的正确方法吗?我对情况的理解是否正确?有没有更好的方法来做到这一点?

感谢您的时间和贡献。

1 个答案:

答案 0 :(得分:2)

以下代码段基于s_client中的代码:

SSL* ssl = ...;
STACK_OF(X509)* certCollection = SSL_get_peer_cert_chain(ssl);
for (size_t i = 0; i < sk_X509_num(certCollection); i++)
{
  X509* cert = sk_X509_value(certCollection, i);
  ...
}

据我所知,必须创建SSL会话,否则SSL_get_peer_cert_chain将返回null。此外,我还没有发现任何证据与我在问题中提到的列表相矛盾。

也许更简单的替代方法是使用命令行工具(从here下载):

openssl s_client -connect {server}:{port} -ssl3