【问题标题】:Certificate verification with BIO_do_connect()使用 BIO_do_connect() 进行证书验证
【发布时间】:2020-03-19 02:59:58
【问题描述】:

BIO_do_connect 通话期间是否执行证书验证?

我试图了解何时使用ssl_get_verify_result()。 文档说这个函数应该和ssl_get_peer_certificate一起使用。但是一些示例(例如IBM's)没有,说OpenSSL 为我们进行了验证。他们只在BIO_do_connect 之后调用ssl_get_verify_result()

我看到BIO_do_connect其实是一个宏:

/* BIO_s_accept() and BIO_s_connect() */
#  define BIO_do_connect(b)       BIO_do_handshake(b)
#  define BIO_do_accept(b)        BIO_do_handshake(b)
# endif /* OPENSSL_NO_SOCK */

# define BIO_do_handshake(b)     BIO_ctrl(b,BIO_C_DO_STATE_MACHINE,0,NULL)

所以,我的理解是BIO_do_connect 实际上并没有检查服务器是否发送了证书。如果服务器确实发送了证书,那么ssl_get_verify_result 将使用它来执行验证。如果它没有发送一个,那么ssl_get_verify_result 仍然返回X509_V_OK。这就是为什么我们需要调用ssl_get_peer_certificate 以确保确实发送了证书。这个对吗?

【问题讨论】:

    标签: c++ openssl ssl-certificate


    【解决方案1】:

    如果您查看 BIO_do_handshake 示例,在调用 BIO_do_handshake 之后调用 ssl_get_verify_result / ssl_get_peer_certificate 是安全的。

    您可以使用SSL_CTX_set_verify自定义验证过程,在其中您可以提供回调验证功能。这允许您提供自己的验证规则,例如允许覆盖自签名证书支持等内容。

    【讨论】:

    • 跟进:通过wireshark,我可以看到BIO_do_connect会同时进行TCP握手和TLS握手。有什么特殊原因为什么需要调用BIO_do_handshake 吗?事实上,当我在BIO_do_connect 之后调用它时,它实际上并没有任何效果。
    • 您现在正在查看实现...取决于您是否希望版本之间兼容。如果您查看文档/示例,则应该执行 BIO_do_connect / BIO_do_handshake。如果您不在乎,BIO_do_connect 会做(正如您提出的问题,无论如何它们都是同一件事),但它可能会在版本之间中断,或者更新到不同的版本或 openssl。
    • 我明白了。所以为了安全起见,无论如何我都应该调用BIO_do_handshake(即使它现在没有效果),以​​确保与未来版本的openssl兼容。
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2011-01-28
    相关资源
    最近更新 更多