【问题标题】:OpenSSL verify_callback and SSL_connectOpenSSL verify_callback 和 SSL_connect
【发布时间】:2016-01-30 22:59:05
【问题描述】:

SSL_CTX_set_verify()SSL_set_verify() 调用可用于分别为底层上下文和 ssl 设置 verify_callback() 函数。这是verify_callback()文档中的一个sn-p:

verify_callback的返回值控制着策略 进一步的验证过程。如果 verify_callback 返回 0,则 验证过程立即停止并显示“验证失败” 状态。如果设置了 SSL_VERIFY_PEER,则会发送验证失败警报 到对等方并且 TLS/SSL 握手终止。如果 verify_callback 返回 1,继续验证过程。如果 verify_callback 总是返回 1,TLS/SSL 握手不会 因验证失败和连接而终止 将成立。

现在我的问题。如果我设置了verify_callback()(以及任何其他必要的OpenSSL设置调用、证书等),然后调用SSL_connect(),是否可以安全地假设任何对verify_callback()的调用都将在返回之前返回SSL_connect() 的电话?

在我看来,这是一个安全的假设,因为文档指出此回调决定是否建立连接。所以回调会直接影响SSL_connect()调用的返回值。任何人都可以确认/否认这个假设吗?

【问题讨论】:

    标签: c++ linux openssl


    【解决方案1】:

    假设您只对 TCP 连接感兴趣:简短回答:,长回答:视情况而定

    • 如果您以阻止模式连接 - 始终
    • 如果您以非阻塞模式连接 - SSL_connect 可能会在建立连接的过程中返回 -1。在这种情况下,您应该调用SSL_get_error 并检查问题所在(如果它返回SSL_ERROR_WANT_READSSL_ERROR_WANT_WRITE,您需要重复SSL_connect 调用)。如果您需要重复呼叫 - 那么答案是verify_callback 将在第一次和最后一次SSL_connect 呼叫之间的某个位置被呼叫)。

    【讨论】:

    • 感谢您的回答。我假设您的回答暗示以下内容:如果底层套接字是非阻塞的,并且SSL_connect 成功返回(即使在多次重复调用之后),那么这意味着verify_callbackSSL_connect 之前被调用并返回回归?
    • @HK - 是的,在非阻塞套接字的情况下,verify_callback 将在第一次和最后一次SSL_connect 调用之间的某个位置被调用。
    • 还有一件事。你介意告诉我这是否记录在某处吗?还是没有使用 OpenSSL 的经验?
    • @HK - 来自经验(我使用 OpenSSL 编写了很多代码)和查看 OpenSSL 源代码。
    猜你喜欢
    • 2011-04-12
    • 2018-10-04
    • 2019-03-28
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多