Сервер OpenSSL TLS не может получить сертификат клиента - PullRequest
0 голосов
/ 27 мая 2020

Когда я пытался авторизовать сертификат клиента на стороне сервера. Но SSL_get_peer_certificate всегда возвращает NULL, даже если клиент отправил правильный сертификат (подтвержденный в журнале wirehark). Не могли бы вы дать какое-нибудь предложение? Я прочитал все реализованные случаи в stackoverflow, но все еще не нашел причины.

код сервера:

        ssl_ctx = SSL_CTX_new(SSLv23_server_method());
    SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL);
    SSL_CTX_set_options(ssl_ctx,
            SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 |SSL_OP_NO_COMPRESSION | SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION);
    SSL_CTX_set_keylog_callback(ssl_ctx, keylog_callback);
        if(!SSL_CTX_use_certificate_file(ssl_ctx, serverCert_filename,SSL_FILETYPE_PEM)
        || !SSL_CTX_use_PrivateKey_file(ssl_ctx,  serverKey_filename, SSL_FILETYPE_PEM)
        || !SSL_CTX_check_private_key(ssl_ctx))
     {
        ERR_print_errors_fp(stderr);
    }
if (!SSL_CTX_load_verify_locations(ssl_ctx, serverCertRoot_filename, NULL))
{
   print error info.
}

    SSL_CTX_use_certificate_chain_file(ssl_ctx, serverCert_filename) ;
    SSL_CTX_set_mode(ssl_ctx, SSL_MODE_AUTO_RETRY);
        cert_names = SSL_load_client_CA_file(serverCertRoot_filename);//serverCert_filename //clientCert_filename //serverCertRoot_filename
        if (cert_names != NULL)
        {
            SSL_CTX_set_client_CA_list(ssl_ctx, cert_names);
        }
    SSL_CTX_set_verify_depth(ssl_ctx, 10);

    ....

    ssl = SSL_new(ssl_ctx);
        X509* cert = NULL;
        cert = SSL_get_peer_certificate(ssl);
    //here, cert always is NULL
        int res = SSL_get_verify_result(ssl);

код клиента: // Клиент может работать хорошо.

ctx = SSL_CTX_new(method);
    SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
    SSL_CTX_set_verify_depth(ctx, 10);
    if (!SSL_CTX_use_certificate_file(ctx, clientCert_filename, SSL_FILETYPE_PEM)
            || !SSL_CTX_use_PrivateKey_file(ctx, clientKey_filename, SSL_FILETYPE_PEM)
        || !SSL_CTX_check_private_key(ctx)) 
    {
        ERR_print_errors_fp(stderr);
    }
    if (!SSL_CTX_load_verify_locations(ctx, clientCertRoot_filename, NULL))
         errhandle.
    SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);

....
    ssl = SSL_new(ssl_ctx);
    peer_cert = SSL_get_peer_certificate(ssl);
        int res = SSL_get_verify_result(ssl);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...