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



我是安全领域的新手,所以有些术语可能使用不正确:

  • 当我使用SSL_connect创建套接字连接时,服务器应该发回整个证书链,以便验证服务器的真实性
  • 为此,需要相应地配置服务器
  • 如果服务器没有发回整个证书链,并且中间证书不在客户端证书存储中,则无法验证真实性。这导致了FireFox认为网站不安全的行为
  • 我还读到一些浏览器能够自动获得中间证书。然而,OpenSSL的行为并不是这样的,至少在默认情况下是这样
  • 我还被告知,自从几年前推出一些Windows更新以来,一些(也许所有)中间证书已经安装在Windows证书存储中

我想查看服务器返回的证书,以验证我是否正在取回整个证书链。以下是我尝试过的:

  • 我正在使用SSLv3_method
  • 使用CCD_ 4来设置CCD_
  • 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;
}

这是获取证书链的正确方法吗?我对情况的理解正确吗?有更好的方法吗?

感谢您的时间和贡献。

以下代码片段基于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。此外,我没有发现任何证据与我在问题中提到的清单相矛盾。

也许一个更简单的选择是使用命令行工具(从这里下载):

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

最新更新