如何从网站下载 ssl 证书?

Rai*_*tor 222 ssl openssl wget ssl-certificate

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

Sea*_*der 306

为了下载证书,您需要像这样使用 openssl 内置的客户端:

echo -n | openssl s_client -connect $HOST:$PORTNUMBER -servername $SERVERNAME \
    | openssl x509 > /tmp/$SERVERNAME.cert
Run Code Online (Sandbox Code Playgroud)

这会将证书保存到/tmp/$SERVERNAME.cert.

在 SNI 的情况下,-servername 用于在出现多个证书时选择正确的证书。

-showcerts如果要下载链中的所有证书,可以使用。但如果只是想下载服务器证书,则无需指定-showcerts. 最后的“x509”将去除中间证书,您需要使用“sed -n '/-----BEGIN/,/-----END/p'”而不是x509结尾。

echo -n 给服务器一个响应,以便释放连接

openssl x509'删除有关证书链和连接详细信息的信息。这是将证书导入其他密钥库的首选格式。

  • 感谢您不仅给出了很好的答案,而且还给出了准确的解释。 (15认同)
  • 但是,这在代理存在的情况下不起作用。 (5认同)
  • 这也不适用于使用 SNI(单个 IP 地址上的多个证书/域)的服务器。为避免出现问题,指定openssl的servername参数:openssl s_client -connect HOST:PORTNUMBER -servername CN (5认同)
  • @Thomas 是的,但只返回 1 个证书。如果您需要多个证书(如链中所示),则需要 sed。例如: `openssl s_client -connect $server:$port -servername $server -showcerts 2>&1 < /dev/null | sed -n '/-----BEGIN/,/-----END/p' > chain.pem` (3认同)
  • openssl 1.1.0 和更高版本现在支持带有`-proxy` 选项的代理(例如`-proxy 127.0.0.1:3000`)。 (3认同)
  • `sed` 命令的一个更短的替代方法是 `openssl x509`。没有任何额外的参数,从 stdin 读取 PEM 格式的证书,并以 PEM 格式将其打印回 stdout,忽略不在 `-BEGIN CERTIFICATE-` 和 `-END CERTIFICATE-` 行之间的任何内容。 (2认同)

Rai*_*tor 67

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

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

  • 也可以使用 `openssl x509 -text <<EOF cert-text EOF` 来查看证书的详细信息 (2认同)
  • `sudo rm -f cert.pem && sudo echo -n | openssl s_client -connect localhost:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./cert.pem` 礼貌 http://serverfault.com/questions/139728/how-to-download-ssl-certificate-来自网站 (2认同)
  • [this](http://superuser.com/a/641396/96477) 完成相同的操作并跳过 `sed` hack。 (2认同)

big*_*ose 28

GNUTLS客户端工具,gnutls-cli也可以使这个简单的:

gnutls-cli --print-cert www.example.com \
        < /dev/null \
        > www.example.com.certs
Run Code Online (Sandbox Code Playgroud)

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


Tho*_*ner 15

true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509
Run Code Online (Sandbox Code Playgroud)

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


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

  • (1) 这并没有真正改善 6 年前的答案 (2) `x509` 默认读取 stdin,因此 `-in /dev/stdin` 是多余的 (3) `s_client` 验证服务器证书正确链接到本地信任锚 (root) 并且未过期,但是您已经抑制了显示此信息的信息 (4) 它不检查吊销 (5) 它仅在 1.0.2 中检查服务器证书中的 _name_,然后不检查默认(但您可以通过查看证书轻松地自己检查) (3认同)

oDD*_*ooL 10

根据@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
Run Code Online (Sandbox Code Playgroud)