SSL客户端身份验证返回Bad Certificate错误

时间:2012-09-29 07:53:58

标签: ssl openssl client-server debian-based

我试图连接到用CPP编写的自定义编写的ssl服务器。它具有客户端身份验证功能。通过Wireshark观看它的投掷错误坏证书。在服务器端,返回的错误是

14560:error:140890B2:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:no certificate returned:s3_srvr.c:2619:

我使用以下代码强制请求客户端证书

SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
SSL_CTX_set_verify_depth(ctx, 1);

我可以在Wireshark看到客户端返回证书。

应该使用哪个函数来设置用于验证服务器端客户端证书的公钥?

5 个答案:

答案 0 :(得分:1)

从错误消息中看起来您的客户端没有向服务器提供证书,并且您明确要求客户端需要提供证书(在服务器代码中):

SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);

可能需要的是告诉您的客户端代码使用证书(以及私钥):

SSL_CTX_use_certificate_chain_file(ctx, pcszCertPath);
SSL_CTX_use_PrivateKey_file(ctx, pcszPrivKeyPath,SSL_FILETYPE_PEM);

我希望有所帮助。 还要确保您的服务器使用相同的证书链(它信任相同的CA)。如果这是一个问题,请告诉我,我会帮助你做到这一点。

答案 1 :(得分:0)

使用wireshark,您将了解服务器是否曾向客户端请求过证书。该命令将是“CertificateRequest”。

答案 2 :(得分:0)

我收到了类似的错误(只有行号不同):

140671281543104:错误:140890B2:SSL例程:SSL3_GET_CLIENT_CERTIFICATE:未返回证书:s3_srvr.c:3292:

我使用https://help.ubuntu.com/community/OpenSSL中提到的程序生成了自签名证书。

在错误处理了一天之后,我发现错误是因为自生成的CA不在我正在使用的机器的信任链中。

要将CA添加到RHEL-7中的信任链,可以按照以下步骤进行操作:

        To add a certificate in the simple PEM or DER file formats to the
        list of CAs trusted on the system:

        Copy it to the
                /etc/pki/ca-trust/source/anchors/
        subdirectory, and run the
                update-ca-trust
        command.

        If your certificate is in the extended BEGIN TRUSTED file format,
        then place it into the main source/ directory instead.

我认为Fedora也可以遵循上述程序。 如果“update-ca-trust”命令不可用,则可能有必要探索“update-ca-certificates”之类的命令。 希望这对某人有用。

答案 3 :(得分:0)

Difference Between SSLCACertificateFile and SSLCertificateChainFile

SSLCertificateChainFile通常是选择的正确选项,因为它影响最小;它会使列出的文件与证书一起发送到任何连接的客户端。

将所有根CA提供给以下文件以解决此问题 SSLCACertificateFile (以下简称“CACert”)执行SSLCertificateChainFile执行的所有操作(以下称“链”),并且还允许使用相关证书来签署客户端证书。这种认证很少见(至少暂时如此),如果你不使用它,恕我直言,没有理由通过使用CACert而不是Chain来增强其功能。另一方面,有人可能认为附加功能没有任何损害,而CACert涵盖了所有情况。这两个论点都是有效的。

毋庸置疑,如果您询问证书供应商,他们将始终推动CACert over Chain,因为它给了他们另一件事(客户证书),他们可能会将您卖给您。 ;)

答案 4 :(得分:0)

用以下行修改服务器代码:

服务器代码:

SSL_CTX_load_verify_locations(ctx,"client_certificate_ca.pem", NULL);
  • 此处client_certificate_ca.pem是生成客户端证书的文件。 使用以下命令,使用“ client_certificate_ca.pem”文件验证您的客户端证书。

验证-CAfile client_certificate_ca.pem client_certificate.pem

客户代码:

if (SSL_CTX_use_certificate_file(ctx, "client_certificate.pem", SSL_FILETYPE_PEM) <= 0) 
{
}
if (SSL_CTX_use_PrivateKey_file(ctx, "client_certificate.ky", SSL_FILETYPE_PEM) <= 0)
{
}
if (!SSL_CTX_check_private_key(ctx))
{  
}