我正在尝试获得远程服务器的证书,然后可以将其添加到我的密钥存储库中并在Java应用程序中使用。

一位高级开发人员(他正在度假:)告诉我,我可以运行这个:

openssl s_client -connect host.host:9999

来获得一个原始证书,然后我可以复制和导出。我收到以下输出:

depth=1 /C=NZ/ST=Test State or Province/O=Organization Name/OU=Organizational Unit Name/CN=Test CA
verify error:num=19:self signed certificate in certificate chain
verify return:0
23177:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1086:SSL alert number 40
23177:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:

我也尝试过这个选项:

-showcerts

还有这个(在Debian上运行):

-CApath /etc/ssl/certs/

但是我得到了同样的错误。

这个消息来源说我可以使用CApath标志,但它似乎没有帮助。我尝试了多种途径,但都无济于事。

请告诉我哪里做错了。


当前回答

HOST=gmail-pop.l.google.com
PORT=995

openssl s_client -servername $HOST -connect $HOST:$PORT < /dev/null 2>/dev/null | openssl x509 -outform pem

其他回答

与SNI

如果远程服务器使用SNI(即在一个IP地址上共享多个SSL主机),则需要发送正确的主机名以获得正确的证书。

openssl s_client -showcerts -servername www.example.com -connect www.example.com:443 </dev/null

没有SNI

如果远程服务器没有使用SNI,那么你可以跳过-servername parameter:

openssl s_client -showcerts -connect www.example.com:443 </dev/null

要查看站点证书的完整细节,您也可以使用以下命令链:

$ echo | \
    openssl s_client -servername www.example.com -connect www.example.com:443 2>/dev/null | \
    openssl x509 -text

为了让像我这样尝试在访问AWS CloudFront时遵循这里的好建议但失败的人受益,诀窍是添加-servername domain.name…

来源:https://serverfault.com/a/780450/8972

启动客户端:

openssl s_client -showcerts stackoverflow.com:443

通过停止STDIN (CTRL+D)或终止进程(CTRL+C)退出。

禁用输入,并在显示证书后强制客户端退出。

openssl s_client -showcerts stackoverflow.com:443 < /dev/null

要获得远程服务器的证书,你可以使用openssl工具,你可以在BEGIN certificate和END certificate之间找到它,你需要复制并粘贴到你的证书文件(CRT)中。

下面是演示它的命令:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt

要从链中返回所有证书,只需添加g (global),如下所示:

ex +'g/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq

然后,只需将证书文件(file.crt)导入到您的钥匙串中,并使其受信任,这样Java就不会抱怨了。

在OS X上,你可以双击文件或拖放你的钥匙链访问,所以它会出现在登录/证书。然后双击导入的证书并使其始终信任SSL。

在CentOS 5上,您可以将它们追加到/etc/pki/tls/certs/ca-bundle.执行:sudo update-ca-trust force-enable,或者在CentOS 6中拷贝到/etc/pki/ca-trust/source/anchors/,然后执行sudo update-ca-trust extract。

在Ubuntu中,将它们复制到/usr/local/share/ca-certificates中,然后执行sudo update-ca-certificates。

我是在这种情况下,从上述命令输出两个证书;所以现在我只提取了第二部分:服务器证书

对不起,命令太长了:

openssl s_client -servername token.actions.githubusercontent.com -showcerts -connect token.actions.githubusercontent.com:443 2>/dev/null </dev/null | awk '/BEGIN CERTIFICATE/ && c++,/END CERTIFICATE/'