我试图连接到用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看到客户端返回证书。
应该使用哪个函数来设置用于验证服务器端客户端证书的公钥?
答案 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);
验证-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))
{
}