OpenSSL的相互身份验证总是成功的

Mutual authentication always succeeds with OpenSSL

本文关键字:成功 OpenSSL 身份验证      更新时间:2023-10-16

我正在使用openssl和zmq编写服务器和客户端。我的客户端和服务器需要相互身份验证。但在服务器上设置了SSL_CTX_set_verify(ssl_ctx,SSL_VERIFY_FAIL_IF_NO_PEER_CERT,NULL)之后,无论客户端是否发送证书,握手都会成功。此外,SSL_get_peer_certificate(tls->get_ssl_())返回null,SSL_get_verify_result(tls->get_ssl_())返回0,这意味着X509_V_OK

我现在真的很困惑和绝望。有什么建议或更正吗?

这是我代码的一部分:

OpenSSL_add_all_algorithms();
SSL_library_init();
SSL_load_error_strings();
ERR_load_BIO_strings();
const SSL_METHOD *meth;
SSL_CTX *ssl_ctx;
     //**************************part of client************************
  {
    meth = SSLv23_client_method();
    ssl_ctx = SSL_CTX_new(meth);   

    SSL_CTX_set_verify(ssl_ctx,SSL_VERIFY_PEER,NULL);
    int rc1 = SSL_CTX_load_verify_locations(ssl_ctx, ".\demoCA\private\server_chain.pem",".\demoCA\private\");///   
     SSL_CTX_set_default_passwd_cb_userdata(ssl_ctx,"pw");
     std::string cert_chain(".\demoCA\private\client_chain.pem");
     std::string cert(".\demoCA\private\client_crt.pem");
     std::string key(".\demoCA\private\client_key.pem");
     int code = SSL_CTX_use_certificate_chain_file(ssl_ctx,cert_chain.c_str());
     if (code != 1)
    {
         std::cout<<"error1n";
        //throw TLSException("failed to read credentials.");
     }
    code = SSL_CTX_use_PrivateKey_file(ssl_ctx,key.c_str(),SSL_FILETYPE_PEM);   
    i f (code != 1)
    {
        std::cout<<"error2n";
        //throw TLSException("failed to read credentials.");
    }
    if(!SSL_CTX_check_private_key(ssl_ctx))
    {
        std::cout<<"key wrong";
        system("pause");
        exit(0);
    }
   }
//*****************part of server****************************
{
    meth = SSLv23_server_method();
    ssl_ctx = SSL_CTX_new(meth);
    SSL_CTX_set_verify(ssl_ctx,SSL_VERIFY_FAIL_IF_NO_PEER_CERT,NULL)   
    SSL_CTX_set_client_CA_list(ssl_ctx,SSL_load_client_CA_file(".\demoCA\private\client_chain.pem"));//
    SSL_CTX_set_default_passwd_cb_userdata(ssl_ctx,"pw");
    std::string cert_chain(".\demoCA\private\server_chain.pem");
    std::string cert(".\demoCA\private\server_crt.pem");
    std::string key(".\demoCA\private\server_key.pem");
    int rc = SSL_CTX_use_certificate_file(ssl_ctx,cert.c_str(),SSL_FILETYPE_PEM);
    if (rc!=1)
    {
        //throw TLSException("failed to read credentials.");
        std::cout<<"error1n";
    }
    rc = SSL_CTX_use_PrivateKey_file(ssl_ctx,key.c_str(),SSL_FILETYPE_PEM);
    if (rc!=1)
    {
        //throw TLSException("failed to read credentials.");   
        std::cout<<"error2n";
    }
    int rcode = SSL_CTX_check_private_key(ssl_ctx);
    if(rcode!=1)
    {
        std::cout<<"key wrong";
        system("pause");
        //exit(0);
    }
}

来自SSL_CTX_set_verify:的文档

SSL_VERIFY_FAIL_IF_NO_PEER_CERT-

服务器模式:如果客户端没有返回证书,TLS/SSL握手将立即终止;握手失败";警报此标志必须与SSL_VERIFY_PEER一起使用

您没有如文档中所述将其与SSL_VERIFY_PEER一起使用,因此它没有任何效果。