我一直在尝试实施一个非常基本的Boost SSL实现来尝试和学习基础知识。我想要与之通信的服务器已经以纯文本形式向我提供了他们的公钥。我已经在其中放了很多其他代码(异步连接,握手等)。
我首先尝试使用Boost SSL流的以下设置实现SSL而不验证其证书:
boost::asio::ssl::context ctxt(boost::asio::ssl::context::sslv23);
ctxt.set_verify_mode(boost::asio::ssl::verify_none);
此实现工作正常,我能够与服务器连接。但是,当我尝试实施对等证书的验证时,握手失败。我尝试使用以下代码:
boost::asio::ssl::context ctxt(boost::asio::ssl::context::sslv23);
ctxt.set_verify_mode(boost::asio::ssl::verify_peer);
ctxt.load_verify_file("peer.crt");
我把包含公钥的“peer.crt”(连同----- BEGIN CERTIFICATE -----和----- END CERTIFICATE -----标签)放在目录中我在运行我的可执行文件。无论出于何种原因,握手现在都失败,错误代码为336134278:证书验证失败。我也尝试将验证文件的完整路径放在那里,但没有运气。
我的问题如下:
感谢任何帮助,谢谢!
答案 0 :(得分:2)
set_verify_mode()
和load_verify_file()
的使用看起来很不错。我在自己的代码中完成了这个。如果未指定,则使用默认验证回调。boost::asio
SSL连接的简单方法,但您可以使用OpenSSL命令行工具(例如s_client
)来测试连接。 boost::asio
使用OpenSSL。我怀疑您的文件中没有完整的证书证书链。您可以使用服务器和端口替换www.google.com:443
从服务器中提取它们:
openssl s_client -connect www.google.com:443 -showcerts
如果您只想查看部分证书,例如只有叶证书,你可以使用自己的验证回调。自定义回调的示例以及验证模式和选项的说明位于this page。
答案 1 :(得分:0)
一个好的起点是asio examples中的HTTP客户端。
您是否使用回调函数调用套接字上的set_verify_callback
来验证证书? E.g:
bool verify_certificate(bool preverified, boost::asio::ssl::verify_context& ctx)
{
char subject_name[256];
X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle());
X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256);
return preverified;
}