8

我正在查看 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 可能很棘手。根据经验,我知道我必须执行以下操作才能正确使用该库:

  • 在 Context 对象上禁用 SSLv2、SSLv3 和压缩
  • 为链的构建和检查提供适当的根证书
  • 调用SSL_get_peer_certificate并验证证书是非空的
  • 调用SSL_get_verify_result并验证结果是X509_V_OK
  • 执行名称匹配(CN 或 SAN 必须匹配请求的主机)

OpenSSL 1.1.0 将提供名称检查,但目前仅在 HEAD 中。从OpenSSL 更改日志

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 究竟在配置什么,asio在使用 SSL 时它在其库组件中检查或验证什么?

4

1 回答 1

8

简短回答:您引用的链接中的 Boost 回调函数不验证任何内容。它返回 OpenSSL(通过bool preverified)提供给它的任何初步验证结果。如果需要任何细粒度的验证(如 CN 匹配等),则必须由回调显式完成。

长答案:当 OpenSSL(或 OpenSSL 的 Boost 包装器)调用验证函数时,在这种情况下,bool verify_certificate(bool preverified, boost::asio::ssl::verify_context& ctx)OpenSSL 已经完成了一组初步(或强制)验证。这在文档中进行了解释。

从最深的嵌套级别(根 CA 证书)开始检查证书链,并向上工作到对等方的证书。在每个级别检查签名和颁发者属性。每当发现验证错误时,错误号都会存储在 x509_ctx 中,并在 preverify_ok=0 时调用 verify_callback。通过应用 X509_CTX_store_* 函数 verify_callback 可以找到有问题的证书并执行其他步骤(参见示例)。如果没有发现证书错误,则在进入下一个级别之前调用 verify_callback 并设置 preverify_ok=1。

该文档还引用了一个如何编写更细粒度的验证回调的示例。您可以根据自己的需求从中汲取灵感。

编辑:为了确保 Boost 的内部回调函数除了调用应用程序回调函数之外没有做任何特殊的事情,我查看了engine.ipp,它是调用 OpenSSLSSL_set_verify来设置回调函数的 C++ 模块。看看是如何verify_callback_function实现的。它只是调用应用程序回调。

于 2013-09-29T16:20:12.423 回答