服務端設定了SSL_CTX_set_verify(ssl_ctx,SSC++L_VERIFY_FAIL_IF_NO_PEER_CERT,NULL); 但即使客戶端沒有發送證書 服務端和客戶端也可以完成握手。
此時為什么 SSL_CTX_set_verify失效呢?
相反客戶端設定了SSL_CTX_set_verify(ssl_ctx,SSC++L_VERIFY_PEERFAIL_IF_NO_PEER_CERT,NULL);就可以驗證服務端的證書。
之前看到一個網友說安裝二級證書就好了。我就改成了用證書鏈來驗證(不知道這樣對所謂安裝二級證書的理解對不對。。。)。結果還是服務端能收到客戶端的證書,但是客戶端收不到服務端的證書,但這種情況下依舊可以完成握手。百思不得其解,崩潰中。。。
望大神能給點思路,解答一下TAT
部分代碼:
OpenSSL_add_all_algorithms();
SSL_library_init();
SSL_load_error_strings();
ERR_load_BIO_strings();
const SSL_METHOD *meth;
SSL_CTX *ssl_ctx;
//客戶端部分代碼
{
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,"TSINGHUA");
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);
}
}
//服務端部分代碼
{
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,"TSINGHUA");
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);
}
}
uj5u.com熱心網友回復:
兄弟,我也是這個問題呀,請問你找到解決辦法了嗎TAT,如果找到了請告訴我,我現在也被這個問題給整瘋了!!!!!!!uj5u.com熱心網友回復:
SSL_VERIFY_NONE表示不驗證SSL_VERIFY_PEER用于客戶端時要求服務器必須提供證書,用于服務器時服務器會發出證書請求訊息要求客戶端提供證書,但是客戶端也可以不提供
SSL_VERIGY_FAIL_IF_NO_PEER_CERT只適用于服務器且必須提供證書。他必須與SSL_VERIFY_PEER一起使用
uj5u.com熱心網友回復:
這篇國外文章或許有用:http://etutorials.org/Programming/secure+programming/Chapter+10.+Public+Key+Infrastructure/10.7+Verifying+an+SSL+Peer+s+Certificate/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/121880.html
標籤:網絡通信
