Https 验证错误:num=20:无法获取本地颁发者证书(openssl)

Https 验证错误:num=20:无法获取本地颁发者证书(openssl),https,openssl,Https,Openssl,我已经使用我的操作系统(ubuntu)中没有的CA保护了https背后的Web服务器。因此,当我想要连接到我尝试测试连接的服务器时,我需要指定该CA: $ openssl s_client -CApath /home/user/my-certs/ -connect myhost.internal:443 verify error:num=20:unable to get local issuer certificate verify return:1 .... verify return:1 1

我已经使用我的操作系统(ubuntu)中没有的CA保护了https背后的Web服务器。因此,当我想要连接到我尝试测试连接的服务器时,我需要指定该CA:

$ openssl s_client -CApath /home/user/my-certs/ -connect myhost.internal:443
verify error:num=20:unable to get local issuer certificate
verify return:1
....
verify return:1
140085612160320:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:../ssl/record/rec_layer_s3.c:1543:SSL alert number 40
我还验证了路径中的证书是
OK

$ openssl verify /home/user/my-certs/myhost.internal.cer
/home/user/my-certs/myhost.internal.cer: OK

我做错了什么以及如何继续调试问题?

要正确使用
-CApath
,该目录中的证书文件或链接必须具有名称,这些名称是主题的8个十六进制字符截断哈希,后跟点,通常为零--
internal-ca.cer
绝对不是这样的名称。请参阅系统上的验证手册页(参考s_客户端手册页),以及c_rehash参考手册页的更多详细信息。此外,您显然正在根据默认信任库验证CA,但没有在s_客户端中使用默认信任库。。。。。。但是,
s_客户端
忽略任何证书验证错误并继续;这里的实际错误是服务器拒绝了您的连接,这不是因为您的证书设置。最好的方法是检查服务器日志,看看它不喜欢什么;如果您无法做到这一点,请打开
-state
,或者打开
-msg
,检查协议中发生这种情况的位置以及客户端发送的内容,并根据您对服务器的了解以及对TLS协议的详细理解,尝试猜测服务器不喜欢该协议中的内容。