#1 楼
为了下载证书,您需要使用openssl内置的客户端,如下所示:echo -n | openssl s_client -connect HOST:PORTNUMBER \
| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/$SERVERNAME.cert
将证书保存到
/tmp/$SERVERNAME.cert
。如果要下载链中的所有证书,可以使用
-showcerts
。但是,如果您只想下载服务器证书,则无需指定-showcerts
echo -n
会向服务器发送响应,以便释放连接sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
删除有关证书链和连接详细信息的信息。这是将证书导入其他密钥库的首选格式。#2 楼
我找到了答案。 Openssl提供了它。openssl s_client -connect $ {REMHOST}:$ {REMPORT}
评论
还打开了x509 -text << EOF证书文本EOF以查看证书的详细信息
– mpapis
2012年8月1日下午5:21
sudo rm -f cert.pem && sudo echo -n | openssl s_client -connect本地主机:443 | sed -ne'/ -BEGIN证书-///-END证书-/ p'> ./cert.pem,由serverfault.com/questions/139728/友情提供
–pulkitsinghal
13 Feb 19'2:50
这样可以完成相同操作,并跳过sed hack。
–phs
2013年12月10日上午7:13
这仅检查一个证书,如果服务是负载平衡的服务器组的一部分,该服务器中的每个服务器具有不同的证书(可能由不同的根CA签名),该怎么办?换句话说,mitm攻击可能会使此请求通过真实站点,然后将其他请求定向到他的服务器。有什么办法可以检查吗?并获得域真正拥有的所有证书的列表?
–詹斯·蒂默曼(Jens Timmerman)
2014年4月28日上午10:37
@JensTimmerman“或者换句话说,通过mitm攻击可能使该请求进入真实站点,然后将其他请求定向到他的服务器。”除非中间人拥有目标服务器的有效证书(否则客户端很傻,不检查服务器证书),否则这是不可能的。显然,如果服务器有时提供不同的证书,则您只能希望通过重复连接尝试最终最终获得它们。
– David Tonhofer
2015年8月4日在16:08
#3 楼
GNUTLS客户端工具gnutls-cli
还可简化此操作: gnutls-cli --print-cert www.example.com \
< /dev/null \
> www.example.com.certs
该程序是旨在为站点提供交互式客户端,因此您需要向其提供空输入(在本示例中为
/dev/null
)以结束交互式会话。评论
它如何使gnutls通过(在系统范围内配置的)https代理连接并打印其交换的证书?
–弗雷德里克·诺德(Frederick Nord)
15-10-26在9:55
这打印出太多的证书,我不知道哪个
– daddang quoc
4月29日下午2:30
这个gnutls-cli提供了最新的证书,使用openssl s_client时我得到了旧证书
– datdinhquoc
4月29日下午3:34
#4 楼
true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509
此opensl模式期望stdin,因此我们通过
true |
提供它,它连接到-connect参数中指定的服务器。 2>/dev/null
使错误静音(可选),我们可以将整个输出传递到x509解析器中,指定/dev/stdin
将shell管道用作输入文件。它将仅输出-----BEGIN CERTIFICATE-----
输出的-----END CERTIFICATE-----
至s_client
部分。您可以通过在命令末尾添加> google.com.pem
将其重定向到文件。尽我所知,这不会验证证书链,它只能告诉您ssl是什么最终服务器提供的身份。
评论
(1)并不能真正改善6年前的答案(2)x509默认读取标准输入,因此-in / dev / stdin是多余的(3)s_client验证服务器证书是否正确链接到本地信任锚(根)并且未过期,但是您已抑制了显示此信息的信息(4)它不检查撤销(5)它仅在1.0.2中检查服务器证书中的名称,然后默认情况下不检查(但是您可以轻松地然后通过查看证书来检查自己)
–dave_thompson_085
16年8月11日在21:43
@ dave_thompson_085,问题是如何下载证书,但不显示链信息。我喜欢openssl x509比其他答案中的sed好得多。
– Der_Meister
18-2-22在11:49
这整洁地工作,TKS
– datdinhquoc
4月29日下午2:33
可行,但它给了我旧证书,更好地使用gnutls-cli
– datdinhquoc
4月29日下午3:28
@datdinhquoc是否正在提供多个证书?我推测一个工具将返回第一个x509证书,另一个将返回最后一个。根据我的经验,gnutls-cli显示了所提供的所有证书,我希望openssl会这样做。处理多个证书时可能会比较棘手,如果您使用的是python,我在这里有一个示例x509-loader可能会有用:stackoverflow.com/a/39313870/1695680
–雷神召唤师
4月29日8:27
#5 楼
根据@bignose答案,这是一个独立版本,非常适合例如厨师食谱:sudo apt-get install gnutls-bin
gnutls-cli --print-cert myserver.com </dev/null| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > myserver.crt
sudo cp myserver.crt /usr/local/share/ca-certificates/myserver.crt
sudo update-ca-certificates
#6 楼
使用Ex和流程替换的替代语法:ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt
评论
感谢您不仅给出了很好的答案,而且给出了准确的解释。
– marco.m
2014年1月24日17:13
但是,这在代理的情况下不起作用。
–弗雷德里克·诺德(Frederick Nord)
2015年4月16日9:00
这也不适用于使用SNI(单个IP地址上的多个证书/域)的服务器。为避免出现问题,请指定openssl的servername参数:openssl s_client -connect HOST:PORTNUMBER -servername CN
–verhage
16 Dec 9'在12:30
sed命令的更短替代方法是openssl x509。如果没有任何其他参数,则从stdin读取PEM格式的证书,并将其以PEM格式打印回stdout,而忽略-BEGIN CERTIFICATE-和-END CERTIFICATE-行之间的任何内容。
–托马斯
17-10-3在9:04
openssl 1.1.0及更高版本现在通过-proxy选项支持代理(例如-proxy 127.0.0.1:3000)。
–尼克·史派克(Nick Spacek)
18/12/6在12:14