OpenSSL忽略自签名证书错误

Ram*_*sey 12 c c++ ssl openssl ssl-certificate

我正在用OpenSSL库编写一个小程序,假设它与SSLv3服务器建立连接.此服务器分发自签名证书,导致握手失败并显示以下消息:"sslv3警报握手失败,证书链中的自签名证书."

有没有办法可以强制连接继续进行?我试过这样调用SSL_CTX_set_verify:

SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
Run Code Online (Sandbox Code Playgroud)

但它似乎没有改变任何东西.

有什么建议?

jim*_*mis 7

默认情况下,OpenSSL 会遍历证书链并尝试在每一步进行验证,SSL_set_verify()不会更改,请参见手册页。引用它:

实际的验证过程是使用内置验证过程或使用另一个应用程序提供的验证函数集来执行的,该函数集设置为 SSL_CTX_set_cert_verify_callback(3)。

因此,解决方案是创建一个简单的回调并设置该回调,以便覆盖所有证书链遍历:

static int always_true_callback(X509_STORE_CTX *ctx, void *arg)
{
    return 1;
}

SSL_CTX_set_cert_verify_callback(CTX, always_true_callback);
Run Code Online (Sandbox Code Playgroud)

  • 仅在引用文本下方的几段内容:`如果未指定 verify_callback,则将使用默认回调。它的返回值与 preverify_ok 相同,因此如果设置了 SSL_VERIFY_PEER,任何验证失败都将导致 TLS/SSL 握手终止并显示警告消息。`您的答案不正确,将验证模式设置为 SSL_VERIFY_NONE 应该就足够了。 (2认同)