2012-09-29 122 views
1

我试图连接到我自定义编写的CPP中写入的ssl服务器。它具有客户端身份验证功能。它在通过Wireshark观看时出现错误的错误证书。在服务器端错误返回SSL客户端认证返回错误证书错误

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的换票证。

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

回答

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)。如果这是一个问题,让我知道,我会帮你做到这一点。

0

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

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”之类的命令。 希望这对别人有用。

0

Difference Between SSLCACertificateFile and SSLCertificateChainFile

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

提供所有的根CA到下面的文件来解决问题 SSLCACertificateFile(以下简称“CACERT”)做一切SSLCertificateChainFile做(以下简称“链”),并且还允许使用有问题的证书的签署客户证书。这种认证是非常罕见的(至少现在是这样),如果你不使用它,恕我直言,没有理由通过使用CACert而不是Chain来增强它的功能。另一方面,有人可能会说,附加功能没有任何损害,CACert涵盖所有情况。两个参数都是有效的。不用说,如果你询问证书供应商,他们会一直推销CACert over Chain,因为它给了他们另一件事(客户证书),他们可能会把你卖掉。 ;)