题 如何从网站下载ssl证书?


我想下载ssl证书,比方说 https://www.google.com,使用wget或任何其他命令。任何unix命令行? wget还是openssl?


162
2018-05-07 21:01






答案:


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


219
2017-10-19 22:59



感谢你不仅给出了一个很好的答案,而且还有一个精确的解释。 - marco.m
是否 -showcerts 显示服务器/叶子证书?我认为只有在包含该开关时才显示中间体。 - Mike B
正如答案所说, s_client 始终显示服务器证书(如果有的话,即服务器响应hello而不选择匿名套件)。 -showcerts 节目 所有 收到的证书,服务器证书然后中间人和/或根。 - dave_thompson_085
但是,这在代理存在的情况下不起作用。 - Frederick Nord
这也不适用于使用SNI的服务器(单个IP地址上的多个证书/域)。为避免出现问题,请指定openssl的servername参数:openssl s_client -connect HOST:PORTNUMBER -servername CN - verhage


我找到了答案。 Openssl提供它。

openssl s_client -connect $ {REMHOST}:$ {REMPORT}


54
2018-05-07 21:05



也 openssl x509 -text <<EOF cert-text EOF 查看证书的详细信息 - mpapis
sudo rm -f cert.pem && sudo echo -n | openssl s_client -connect localhost:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./cert.pem 礼貌 serverfault.com/questions/139728/... - pulkitsinghal
这个 完成相同并跳过 sed 黑客攻击。 - phs
这只是检查一个证书,如果服务是负载平衡服务器组的一部分,每个服务器都有不同的证书,可能由不同的根CA签名,该怎么办?或者换句话说,mitm攻击可能会让此请求进入真实站点,然后将其他请求发送到他的服务器。有没有办法检查这个?并获得域名真正具有的所有证书的列表? - Jens Timmerman
@JensTimmerman “或者换句话说,mitm攻击可能会让这个请求进入真实站点,然后将其他请求发送到他的服务器。” 除非中间人具有目标服务器的有效证书(或者客户端是愚蠢的,不检查服务器证书),否则这是不可能的。显然,如果服务器有时会提供不同的证书,您只能希望通过重复连接尝试最终获得所有证书。 - David Tonhofer


GNUTLS 客户端工具, gnutls-cli,也可以让这很容易:

gnutls-cli --print-cert www.example.com \
        < /dev/null \
        > www.example.com.certs

该程序旨在为站点提供交互式客户端,因此您需要为其提供空输入(在此示例中,来自 /dev/null)结束交互式会话。


20
2017-10-07 06:19



如何使gnutls连接(系统范围配置)https代理并打印它交换的证书? - Frederick Nord


基于@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

8
2018-05-27 09:31





true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509

这种openssl模式需要stdin,所以我们提供它 true |,这将连接到-connect参数中指定的服务器。 2>/dev/null 沉默错误(可选),我们可以将整个输出传递给x509解析器,指定 /dev/stdin 使用shell管道作为输入文件。这将只输出 -----BEGIN CERTIFICATE----- 至 -----END CERTIFICATE----- 的一部分 s_client 输出。您可以通过添加将其重定向到文件 > google.com.pem 到命令的末尾。


我可以说,这不会验证证书链,它只能告诉您终端服务器提供的ssl身份。


6
2018-01-12 10:38



(1)这并没有真正改善6年前的答案(2) x509 默认情况下读取stdin -in /dev/stdin 是多余的(3) s_client 验证服务器证书是否正确链接到本地​​信任锚(root)并且未过期,但是您已经抑制了显示此信息的信息(4)它不会检查吊销(5)它检查 名称 仅在1.0.2中的服务器证书中,然后默认情况下不是(但您可以通过以后查看证书轻松检查自己) - dave_thompson_085
@ dave_thompson_085,问题是如何下载证书,但不显示链信息。我喜欢openssl x509比另一个答案中的sed好得多。 - Der_Meister


使用Ex和进程替换的替代语法:

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

0