openssl 客户端身份验证错误:tlsv1 警报未知 ca:... SSL 警报编号 48

openssl 客户端身份验证错误:tlsv1 警报未知 ca:... SSL 警报编号 48

我已经使用 openssl 生成了一个证书并将其放在客户端的机器上,但是当我尝试使用该证书连接到我的服务器时,我的服务器返回的主题行中提到了错误。

这是我所做的。

1)我使用 openssl 进行测试连接,以查看我的服务器可接受的客户端证书 CA 名称,我从客户端计算机向服务器发出此命令:

openssl s_client -connect myupload.mysite.net:443/cgi-bin/posupload.cgi -prexit

我收到的部分回复如下:

Acceptable client certificate CA names
/C=US/ST=Colorado/L=England/O=Inteliware/OU=Denver Office/CN=Tim Drake/[email protected]
/C=US/ST=Colorado/O=Inteliware/OU=Denver Office/CN=myupload.mysite.net/[email protected]

2)以下是服务器上 apache 配置文件中有关 SSL 客户端身份验证的内容:

SSLCACertificatePath /etc/apache2/certs

SSLVerifyClient require 
SSLVerifyDepth  10

3)我使用 mypos.pem 和 mypos.key 生成了一个名为“client.pem”的自签名客户端证书,因此当我运行此命令时:

openssl x509 -in client.pem -noout -issuer -subject -serial

返回的内容如下:

issuer= /C=US/ST=Colorado/O=Inteliware/OU=Denver Office/CN=myupload.mysite.net/[email protected]
subject= /C=US/ST=Colorado/O=Inteliware/OU=Denver Office/CN=mlR::mlR/[email protected]
serial=0E

(请注意,mypos.pem 位于 /etc/apache2/certs/ 中,而 mypos.key 保存在 /etc/apache2/certs/private/ 中)

4)我将 client.pem 放在客户端机器上,然后在客户端机器上运行以下命令:

openssl s_client -connect myupload.mysite.net:443/cgi-bin/posupload.cgi -status -cert client.pem

我收到此错误:

CONNECTED(00000003)
OCSP response: no response sent
depth=1 /C=US/ST=Colorado/L=England/O=Inteliware/OU=Denver Office/CN=Tim Drake/[email protected]
verify error:num=19:self signed certificate in certificate chain
verify return:0
574:error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca:/SourceCache/OpenSSL098/OpenSSL098-47/src/ssl/s3_pkt.c:1102:SSL alert number 48
574:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:/SourceCache/OpenSSL098/OpenSSL098-47/src/ssl/s23_lib.c:182:

我真的很困惑我做错了什么。我搜索了很多有关这个错误的信息,我发现人们说客户端证书的颁发机构不受服务器信任,但当我查看客户端证书的颁发者时,它与我的服务器返回的其中一个可接受的 CA 相匹配。

有人可以帮忙吗?

先感谢您。

答案1

好的,我终于找到了问题所在,并想分享它,以防有人也遇到该错误信息。

Apache 的配置文件在谈到 CA 时有以下几行:

    #   Set the CA certificate verification path where to find CA
    #   certificates for client authentication or alternatively one
    #   huge file containing all of them (file must be PEM encoded)
    #   Note: Inside SSLCACertificatePath you need hash symlinks
    #         to point to the certificate files. Use the provided
    #         Makefile to update the hash symlinks after changes.

这意味着 SSLCACertificatePath 指向的此目录中的每个证书文件都必须使用符号链接。而且,最重要的是,每个符号链接的名称必须是每个证书的主题哈希值。您可以通过运行以下命令找到 CA 证书的哈希值:

    openssl x509 -subject_hash -in *cacert.pem*

因此,如果哈希值为 0434423b,则在 SSLCACertificatePath 指向的目录中,您应该创建两个符号链接来指向目录中的证书:

0434423b -> /etc/apache2/certs/mypos.pem
0434423b.0 -> /etc/apache2/certs/mypos.pem

这应该可以解决问题。当然,如果我使用了 SSLCACertificateFile,我想我不会遇到这么多问题。

我在这里找到了 SSLCACertificatePath 的解释:

openssl 的验证命令页面

查看-CApath目录

答案2

我发现“sudo update-ca-certificates --fresh”命令会自动从每个证书的主题哈希值生成到该证书的符号链接。

答案3

你好,你尝试过运行以下命令吗?

openssl s_client -connect myupload.mysite.net:443/cgi-bin/posupload.cgi -status -cert client.pem -verify 1 -showcerts

注意验证 1。它告诉 SSL 需要多深,我认为这可能是您在 apache 配置中遇到的问题。尝试设置 apache 配置,

SSL验证深度 1

干杯,德克斯特

相关内容