2015-02-08 3 views
1

Я использую openssl и zmq для записи сервера и клиента. Моему клиенту и серверу нужна взаимная аутентификация. , но после того, как я установил SSL_CTX_set_verify(ssl_ctx,SSL_VERIFY_FAIL_IF_NO_PEER_CERT,NULL) на сервер, рукопожатие всегда успевает ли клиент отправить сертификат или нет. Кроме того, SSL_get_peer_certificate(tls->get_ssl_()) return null и SSL_get_verify_result(tls->get_ssl_()) return 0, что означает X509_V_OK.Взаимная аутентификация всегда преуспевает с OpenSSL

Я действительно запутался и отчаялся сейчас. Любые предложения или исправления?

Это часть моего кода:

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<<"error1\n"; 
     //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<<"error2\n"; 
     //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<<"error1\n"; 
    } 

    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<<"error2\n"; 
    } 

    int rcode = SSL_CTX_check_private_key(ssl_ctx); 
    if(rcode!=1) 
    { 
     std::cout<<"key wrong"; 
     system("pause"); 
     //exit(0); 
    } 
} 
+0

См. Также [Инициализация библиотеки] (https://wiki.openssl.org/index.php/Library_Initialization) в вики OpenSSL. Нет необходимости в четырех входящих вызовах запуска. – jww

+0

Вы имеете в виду это? OpenSSL_add_all_algorithms(); SSL_library_init(); SSL_load_error_strings(); ERR_load_BIO_strings(); – 601492584

ответ

2

От documentation of SSL_CTX_set_verify:

SSL_VERIFY_FAIL_IF_NO_PEER_CERT

Режим сервера: если клиент не возвращает сертификат, TLS/SSL рукопожатия немедленно прекращается с предупреждением о сбое рукопожатия. Этот флаг должен использоваться вместе с SSL_VERIFY_PEER.

Вы не использовали его вместе с SSL_VERIFY_PEER, как описано в документации, и, таким образом, это не имеет никакого эффекта.

+0

Бог! Большое спасибо !!! Я заметил это примечание, но я принял его неправильно, я думал, что это означает использование SSL_VERIFY_PEER на клиенте! – 601492584

+0

Большое спасибо, за то, что я перестаю тратить больше времени на эту глупую ошибку. – 601492584

+0

эй ... .. У меня есть еще одна проблема: http://stackoverflow.com/questions/29211061/using-openssl-with-its-unblocked-bio-ssl-read-return-ssl-error-syscall- и-ssl. Вы хотите посмотреть на это? Что может называть эта проблема, какие-то идеи? – 601492584

Смежные вопросы