1

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

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 中返回证书。

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

4

5 回答 5

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)。如果这是一个问题,请告诉我,我会帮助你做到这一点。

于 2012-09-30T10:28:43.063 回答
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”等命令可能会很有用。希望这对某人有用。

于 2014-07-25T09:19:07.237 回答
0

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

于 2013-04-01T20:04:34.190 回答
0

SSLCACertificateFile 和 SSLCertificateChainFile 之间的区别

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

将所有根 CA 提供到以下文件中以解决问题 SSLCACertificateFile(以下简称“CACert”)执行 SSLCertificateChainFile 所做的所有事情(以下简称“Chain”),并且还允许使用有问题的证书来签署客户端证书。这种身份验证非常罕见(至少目前如此),如果您不使用它,恕我直言,没有理由通过使用 CACert 而不是 Chain 来增强其功能。另一方面,有人可能会争辩说附加功能没有任何害处,CACert 涵盖了所有情况。这两个论点都是有效的。

不用说,如果您询问证书供应商,他们将始终推动 CACert over Chain,因为它为他们提供了另一件事(客户证书),他们可能会向您出售。;)

于 2016-11-09T21:23:26.703 回答
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))
{  
}
于 2019-06-26T09:50:53.560 回答