使客户端在身份验证期间将证书发送到服

时间:2015-01-16 07:10:13

标签: c ssl openssl certificate mutual-authentication

我已经使用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

2 个答案:

答案 0 :(得分:1)

  

...我的客户端证书未在服务器端被检测到。我需要在客户端做什么不同的发送证书?

服务器需要致电SSL_CTX_set_client_CA_list。它告诉服务器发送它接受的可分辨名称(DN)列表以进行客户端身份验证。

服务器需要致电SSL_CTX_load_verify_locations(或朋友)。这是服务器实际信任发送给客户端的列表中的CA的位置。

最后,服务器应致电SSL_CTX_set_verify并同时设置SSL_VERIFY_PEERSSL_VERIFY_FAIL_IF_NO_PEER_CERT

答案 1 :(得分:0)

我想证书已发送但服务器未接受,即无法针对服务器上的可信CA进行验证。服务器端关于no certificate returned的错误消息可能会产生误导,请参阅https://stackoverflow.com/a/27951490/3081018

我建议先查看wireshark或openssl s_server,看看证书是否未发送,或者是否未被同行接受。