2

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

4

2 回答 2

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

于 2016-06-28T23:51:53.693 回答
0

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

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

于 2015-01-16T07:20:39.457 回答