我已经使用OpenSSL设置了客户端 - 服务器通信,我的服务器正在发送它的证书。现在,我想让我的客户端也向服务器发送证书。在我的客户端,我有以下代码:
ctx = InitCTX();
LoadCertificates(ctx, "clientCert.pem", "clientCert.pem"); /* load certs */
server = OpenConnection(hostname, atoi(portnum));
ssl = SSL_new(ctx); /* create new SSL connection state */
SSL_set_fd(ssl, server); /* attach the socket descriptor */
这是我的LoadCertificates
函数:
void LoadCertificates(SSL_CTX* ctx, char* CertFile, char* KeyFile)
{
if ( SSL_CTX_use_certificate_file(ctx, CertFile, SSL_FILETYPE_PEM) <= 0 )
{
ERR_print_errors_fp(stderr);
abort();
}
/* set the private key from KeyFile (may be the same as CertFile) */
if ( SSL_CTX_use_PrivateKey_file(ctx, KeyFile, SSL_FILETYPE_PEM) <= 0 )
{
ERR_print_errors_fp(stderr);
abort();
}
/* verify private key */
if ( !SSL_CTX_check_private_key(ctx) )
{
fprintf(stderr, "Private key does not match the public certificate\n");
abort();
}
printf("Certificate attached.\n");
}
我在服务器端有相同的LoadCertificates
功能,这似乎完美无缺。
但是,我的客户端证书未在服务器端检测到。我需要在客户端做什么不同的发送证书?
我使用此处的代码作为基础修改了客户端代码:http://simplestcodings.blogspot.in/2010/08/secure-server-client-using-openssl-in-c.html
答案 0 :(得分:1)
...我的客户端证书未在服务器端被检测到。我需要在客户端做什么不同的发送证书?
服务器需要致电SSL_CTX_set_client_CA_list
。它告诉服务器发送它接受的可分辨名称(DN)列表以进行客户端身份验证。
服务器需要致电SSL_CTX_load_verify_locations
(或朋友)。这是服务器实际信任发送给客户端的列表中的CA的位置。
最后,服务器应致电SSL_CTX_set_verify
并同时设置SSL_VERIFY_PEER
和SSL_VERIFY_FAIL_IF_NO_PEER_CERT
。
答案 1 :(得分:0)
我想证书已发送但服务器未接受,即无法针对服务器上的可信CA进行验证。服务器端关于no certificate returned
的错误消息可能会产生误导,请参阅https://stackoverflow.com/a/27951490/3081018。
我建议先查看wireshark或openssl s_server
,看看证书是否未发送,或者是否未被同行接受。