JoJ*_*Dad 7 certificate authentication openssl
我已经使用 openssl 生成了一个证书并将其放置在客户端的机器上,但是当我尝试使用该证书连接到我的服务器时,我在从我的服务器返回的主题行中提到了错误。
这就是我所做的。
1) 我使用 openssl 进行测试连接以查看我的服务器可接受的客户端证书 CA 名称是什么,我从我的客户端机器向我的服务器发出以下命令:
openssl s_client -connect myupload.mysite.net:443/cgi-bin/posupload.cgi -prexit
Run Code Online (Sandbox Code Playgroud)
我得到的部分内容如下:
Acceptable client certificate CA names
/C=US/ST=Colorado/L=England/O=Inteliware/OU=Denver Office/CN=Tim Drake/emailAddress=tdrake@mysite.com
/C=US/ST=Colorado/O=Inteliware/OU=Denver Office/CN=myupload.mysite.net/emailAddress=tdrake@mysite.com
Run Code Online (Sandbox Code Playgroud)
2) 这是服务器上关于 SSL 客户端身份验证的 apache 配置文件中的内容:
SSLCACertificatePath /etc/apache2/certs
SSLVerifyClient require
SSLVerifyDepth 10
Run Code Online (Sandbox Code Playgroud)
3) 我使用 mypos.pem 和 mypos.key 生成了一个名为“client.pem”的自签名客户端证书,所以当我运行这个命令时:
openssl x509 -in client.pem -noout -issuer -subject -serial
Run Code Online (Sandbox Code Playgroud)
这是返回的内容:
issuer= /C=US/ST=Colorado/O=Inteliware/OU=Denver Office/CN=myupload.mysite.net/emailAddress=tdrake@mysite.com
subject= /C=US/ST=Colorado/O=Inteliware/OU=Denver Office/CN=mlR::mlR/emailAddress=admin@inteliware.com
serial=0E
Run Code Online (Sandbox Code Playgroud)
(请注意 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
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
CONNECTED(00000003)
OCSP response: no response sent
depth=1 /C=US/ST=Colorado/L=England/O=Inteliware/OU=Denver Office/CN=Tim Drake/emailAddress=tdrake@mysite.com
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:
Run Code Online (Sandbox Code Playgroud)
我真的很难过我做错了什么。我已经对这个错误进行了大量搜索,我发现人们说服务器不信任客户端证书的颁发 CA,但是当我查看客户端证书的颁发者时,它与其中之一匹配我的服务器返回的接受的 CA。
请问有人可以帮忙吗?
先感谢您。
好的,我终于找到了问题所在,并想分享它,以防万一有人也遇到该错误消息。
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.
Run Code Online (Sandbox Code Playgroud)
这意味着 SSLCACertificatePath 指向的此目录中的每个证书文件都必须使用符号链接。而且,最重要的是,每个符号链接的名称必须是每个证书的主题哈希值。您可以通过运行以下命令找到 CA 证书的哈希值:
openssl x509 -subject_hash -in *cacert.pem*
Run Code Online (Sandbox Code Playgroud)
因此,如果哈希值为 0434423b,则在 SSLCACertificatePath 指向的目录中,您应该创建两个符号链接以指向目录中的证书:
0434423b -> /etc/apache2/certs/mypos.pem
0434423b.0 -> /etc/apache2/certs/mypos.pem
Run Code Online (Sandbox Code Playgroud)
这应该可以解决问题。当然,如果我使用了 SSLCACertificateFile,我认为我不会遇到这么多问题。
我在这里找到了 SSLCACertificatePath 的解释:
在 -CApath 目录下查看
您好,您是否尝试过运行以下命令,
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
干杯,德克斯特