使用openssl从服务器获取证书

我想获得远程服务器的证书,然后我可以使用它来添加到我的密钥库并在我的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标志,但它似乎没有帮助。 我尝试了多条path无济于事。

请让我知道我要去哪里错了。

与SNI

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

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

没有SNI

如果远程服务器不使用SNI,则可以跳过-servername参数:

 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 

虽然我同意Ari的回答(并且赞成:),但我需要额外采取一些措施才能在Windows上使用Java(需要部署它):

 openssl s_client -showcerts -connect www.example.com:443 < /dev/null | openssl x509 -outform DER > derp.der 

在添加openssl x509 -outform DER转换之前,我在Windows上的keytool上发现一个错误,抱怨证书的格式。 导入.der文件工作正常。

事实certificate,这里有更多的复杂性:我需要提供更多的细节来获得这个滚动。 我认为这与其需要客户端authentication的连接有关,而且需要更多的信息来继续证书被丢弃的阶段。

这是我的工作命令:

 openssl s_client -connect host:port -key our_private_key.pem -showcerts \ -cert our_server-signed_cert.pem 

希望这是一个正确的方向任何人谁可以做一些更多的信息轻推。

最简单的命令行(包括将PEM输出添加到密钥库)以及人类可读的输出,还支持SNI,这对于使用HTTP服务器是非常重要的:

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

-servername选项用于启用SNI支持,而openssl x509 -text以可读格式打印证书。

要获得远程服务器的证书,您可以使用openssl工具,您可以在BEGIN CERTIFICATEEND CERTIFICATE之间find它,您需要将其复制并粘贴到证书文件(CRT)中。

这里是演示它的命令:

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

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

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

然后,您可以简单地将您的证书文件( file.crt )导入您的钥匙串并使其可信,所以Java不应该抱怨。

在OS X上,您可以双击文件或拖放您的钥匙串访问,因此它将出现在login/证书中。 然后双击导入的证书并使其始终为SSL信任

在CentOS 5上,你可以将它们追加到/etc/pki/tls/certs/ca-bundle.crt文件(并运行: 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

您可以使用下一个bash脚本获取并存储服务器根证书:

 CERTS=$(echo -n | openssl s_client -connect $HOST_NAME:$PORT -showcerts | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p') echo "$CERTS" | awk -v RS="-----BEGIN CERTIFICATE-----" 'NR > 1 { printf RS $0 > "'$SERVER_ROOT_CERTIFICATE'"; close("'$SERVER_ROOT_CERTIFICATE'") }' 

只要覆盖所需的variables。

对于像我这样的人,在访问AWS CloudFront时试图遵循这些好build议但是失败的话,诀窍就是添加-servername domain.name..

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

 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