我有一个带有许多证书的PEM文件,格式为:
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
此文件包含我打算通过https连接到我的服务器的证书,并进行验证 使用boost来源中列出的boost ssl验证客户端示例:
Boost1.62/boost_1_62_0/libs/asio/example/cpp03/ssl/client.cpp03/ssl/client
我正在使用load_verify_file调用来加载pem文件。
ctx.load_verify_file("mycerts.pem");
但是验证失败并显示错误:
asio.ssl:336134278 : certificate verify failed
我发现的原因是该程序仅加载上面的pem文件中的第一个证书。
当我手动在pem文件顶部显示服务器的证书时,验证成功。
strace
,还告诉您在打开未验证的pem文件时仅读取第一个-----BEGIN CERTIFICATE-----
。
问题是,根据消息来源,Boost的load_verify_file()函数调用了opensl的:
SSL_CTX_load_verify_locations()
函数,根据定义,该函数应处理所提供的每个证书
多证书.pem文件:
引用openssl doc:
如果CAfile不为NULL,则它指向PEM中CA证书的文件 格式。该文件可以包含多个由
标识的CA证书。----- BEGIN证书----- ...(采用base64编码的CA证书) ... ----- END CERTIFICATE -----序列。之前,之间和之后 允许使用证书文本,例如对于 证书的说明。
在执行以下命令时处理CAfile SSL_CTX_load_verify_locations()函数。
我似乎不明白我可能会缺少什么。