![下载自签名服务器证书](https://linux22.com/image/1415122/%E4%B8%8B%E8%BD%BD%E8%87%AA%E7%AD%BE%E5%90%8D%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AF%81%E4%B9%A6.png)
概括
我需要从服务器下载自签名证书,以创建 .JKS 文件作为应用程序中的信任库。我如何从 Red Hat 服务器执行此操作?
我尝试过
我曾尝试使用 openssl 来获取证书:
echo -n | openssl s_client -connect hostname.example.com:20000 -showcerts | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > downloadedcerts.cert
此操作失败并显示以下消息:
verify error:num=19:self signed certificate in certificate chain
确实,该服务器的根证书是自签名,不是来自 CA。我对此没有异议 - 根证书属于我国的一个政府机构 - 但 openssl 无法连接以下载证书。
在 Firefox 中加载 URL、手动忽略证书错误并下载证书很容易,但由于防火墙,我无法从我的台式机连接到服务器。
任何帮助将非常感激 :)
答案1
验证错误:num=19:证书链中的自签名证书
事实上,该服务器的根证书是自签名的,而不是来自 CA。
它是一个 CA,只是不受信任 ;)
与浏览器(几乎信任所有内容)不同,OpenSSL 不信任任何内容(您必须告诉它信任什么)。
下载您所在国家/地区的 CA 证书(通常不是链中发送)。其不是发送链中因为它是一个信任点;你必须已经拥有它并信任它。
您通常可以在网上找到 CA 证书。例如,这里是 DigiCert 的这里是 Verisign 等。验证您下载的证书。验证是比较棘手的部分 - 浏览器通过携带自己已验证的证书包来解决此问题。
将您所在国家/地区的 CA 证书放入其自己的文件中。然后,使用openssl s_client -connect hostname.example.com:20000 -CAfile my-country-ca.pem
.s_client
将完成Verify OK (0)
或类似操作。
答案2
我建议创建自己的证书颁发机构 [编辑 - 不是想要的。请参阅下一段]。这有点麻烦,当你研究如何做时,你会发现它比实际更难。你只需虚构一家公司,将其证书放入客户的受信任根中,它就可以签署证书,而不是使用自签名证书。
我在 Bruno 对这个问题的回答中找到了解释: https://stackoverflow.com/questions/4103472/ssl-handshake-fails-with-a-verisign-chain-certificate-that-contains-two-ca-s
我一直没有想到根证书是自签名的,但这很有道理。所以,如果我理解正确的话,您不仅获得了所需的证书(第一个证书),还获得了证书链中的所有其他证书。根证书是导致出现该消息的证书。