我在看Boost的SSL Client。评论中有对OpenSSL的引用(抱歉,没有行号):
// The verify callback can be used to check whether the certificate that is
// being presented is valid for the peer. For example, RFC 2818 describes
// the steps involved in doing this for HTTPS. Consult the OpenSSL
// documentation for more details. Note that the callback is called once
// for each certificate in the certificate chain, starting from the root
// certificate authority.
正确的OpenSSL使用和验证可能会非常棘手。根据经验,我知道我必须执行以下操作才能正确使用库:
SSL_get_peer_certificate
并验证证书是非NULL SSL_get_verify_result
并确认结果为X509_V_OK
OpenSSL 1.1.0将提供名称检查,但此时仅在HEAD中。来自OpenSSL Change Log:
Integrate hostname, email address and IP address checking with certificate
verification. New verify options supporting checking in opensl utility.
和
New functions to check a hostname email or IP address against a
certificate. Add options x509 utility to print results of checks against
a certificate.
我没有看到Boost在客户端代码中执行任何配置或检查的位置。
Boost配置究竟是什么,使用SSL时在asio
库组件中检查或验证的内容是什么?
答案 0 :(得分:6)
简短回答:来自您引用的链接的Boost回调函数无法验证任何内容。它返回OpenSSL提供给它的任何初步验证结果(通过bool preverified
)。如果需要任何细粒度验证(如CN匹配等),则必须通过回调明确完成。
长答案:当OpenSSL(或OpenSSL的Boost包装器)调用验证函数时,在这种情况下,bool verify_certificate(bool preverified, boost::asio::ssl::verify_context& ctx)
,一组初步(或强制)验证已经由OpenSSL完成了。这在documentation。
从最深的嵌套级别(根CA证书)开始检查证书链,并向上处理到对等方的证书。在每个级别检查签名和颁发者属性。每当发现验证错误时,错误号存储在x509_ctx中,并且使用preverify_ok = 0调用verify_callback。通过应用X509_CTX_store_ *函数,verify_callback可以找到有问题的证书并执行其他步骤(请参阅示例)。如果没有找到证书的错误,则在进入下一级别之前使用preverify_ok = 1调用verify_callback。
该文档还引用了一个示例,说明如何编写更细粒度的验证回调。您可以从中获取灵感,具体取决于您的需求。
编辑:为了确保Boost的内部回调函数除了调用应用程序回调函数之外没有做任何特殊操作,我看了engine.ipp,调用的C ++模块OpenSSL的SSL_set_verify
来设置回调函数。看看verify_callback_function
是如何实现的。它只是调用应用程序回调。