我想使用wget或任何其他命令从https://www.google.com下载ssl证书。任何UNIX命令行? wget或openssl?

#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'删除有关证书链和连接详细信息的信息。这是将证书导入其他密钥库的首选格式。

评论


感谢您不仅给出了很好的答案,而且给出了准确的解释。

– 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

#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