我是安全领域的新手,所以有些术语可能使用不正确:
- 当我使用
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