如何在本地将远程服务器SSL证书另存为文件


319

我需要下载远程服务器的SSL证书(不是HTTPS,但SSL握手应与Google Chrome / IE / wget相同,并且curl都会给出证书检查失败错误),并将证书添加为我的笔记本电脑中受信任的Windows。证书存储,因为我无法让我的IT人员为我提供CA证书。

这是用于办公室通信的,所以我不能真正使用实际的客户来获取证书。

我该怎么做,我有Windows 7和一堆Linuxes,所以任何工具/脚本语言都可以。


要获得证书的邮件服务器,请参阅security.stackexchange.com/questions/70528/...
巴西的家伙,

您的浏览器很可能为此具有内置功能-可能在“开发人员工具”下。
nobar

Answers:


316

如果您有权访问OpenSSL,请尝试

openssl s_client -connect {HOSTNAME}:{PORT} -showcerts

将{HOSTNAME}和{PORT}替换为您的任何值。


2
我更喜欢此选项,因为我不必打开GUI,并且可以从服务器上通过SSH进行操作。
简朴

2
另外,它适用于HTTP以外的协议。
马特2013年

14
elec3647的解决方案可以完全自动地在Shell管道中提取PEM。
ph

4
443是HTTPS的默认端口。
Flimm

4
我需要-servername获得虚拟主机证书的选项。gist.github.com/Artistan/5219484efb2fe51cd064175b3d0d5971
Artistan

240

获取和下载证书的一种快速方法是运行以下命令,该命令将-showcerts的输出通过管道传递给x509 ssl命令,该命令仅剥离所有多余的内容。例如:

openssl s_client -showcerts -connect server.edu:443 </dev/null 2>/dev/null|openssl x509 -outform PEM >mycertfile.pem

要通过wget使用证书,

wget https:/server.edu:443/somepage --ca-certificate=mycertfile.pem

5
我(在另一个网站上)尝试过此方法-但可以预期整个证书链:看来这只带回了证书中的第一个-是可以预期的吗?
monojohnny 2014年

8
这对我不起作用:无法加载证书27262:错误:0906D06C:PEM例程:PEM_read_bio:没有开始行:/SourceCache/OpenSSL098/OpenSSL098-50/src/crypto/pem/pem_lib.c:648:正在检查:受信任证书
Janusz 2014年

4
我同意monojohnny的观点,但这并不能给您带来完整的了解。
Michael Munsey 2014年

4
晚了,但@monojohnny:openssl s_client -showcerts显示接收到的链中的所有证书(如果连接成功),但是通过管道传输openssl x509仅采用第一个证书,而丢弃其余证书。要获得所有证书,请使用...| sed -n '/^-----BEGIN CERT/,/^-----END CERT/p'或,...| awk '/^-----BEGIN CERT/,/^-----END CERT/'也可以使用稍微复杂一点的awk证书来将每个证书放在单独的文件中,这使得它们更易于与openssl其他工具一起使用。
dave_thompson_085'8

3
使用wget似乎只保存一个index.html=>HTTP request sent, awaiting response... 200 OK Length: unspecified [text/html] Saving to: ‘index.html.1’
OZZIE

126

老实说,我以前从未尝试过(从来不需要),但是,我刚刚在Firefox中尝试过,它似乎可以保存:

  1. 单击顶部的SSL证书图标/底部的“挂锁”。
  2. 请点击 View Certificate
  3. 点击Details标签
  4. 从层次结构中选择所需的证书[未在图中圈出]
  5. 请点击 Export

替代文字


很高兴知道-但是出于我的好奇心,您能否再解释一下您要实现的目标?我从不需要导出SSL客户端证书,并且很好奇为什么您实际上需要这样做...
William Hilsum 2010年

1
那是服务器证书,而不是客户端证书。导出客户端私钥和证书的主要原因是维护备份,或者要使用其他浏览器或计算机进行身份验证。
gbroiles

@gbroiles-阅读了问题,他使用了错误的术语,但这解决了他的问题。
William Hilsum

1
是的,我回答了您的问题-为什么有人要保存客户证书?“ SSL客户端证书”是您的用语,而不是他的用语。
gbroiles

1
看起来好像无法在Chrome中执行此操作,对吗?
fatuhoku

50

使用Chrome浏览器导出证书

  1. 使用SSL(https:// whatever)连接到网站

2.单击锁定符号,然后单击详细信息

  1. 从Chrome版本56开始,您需要执行以下操作:进入“三点菜单”->“更多工具”->“开发者工具”,然后单击“安全性”选项卡。这将为您提供带有“ 查看证书”按钮的“ 安全概述”

  2. 单击查看证书按钮。

    将打开一个模式窗口。它有两个窗格。最上面的一个显示站点证书(列出的最后一个),中间证书和根证书(最上面的证书)的信任层次结构。

    第二个较大的窗格显示其中一个证书的详细信息。

    可能有零个或多个中间证书。

    请注意,根证书具有金色图标。其他的都有蓝色边框。

    请参见下面的屏幕截图。

  3. 导出证书:

    1. 首先在信任层次结构中单击证书的图标。
    2. 证书将显示在模式的主要部分中。
    3. 单击模式主要部分中证书的大图标。图标拖到桌面上。然后,Chrome会将证书复制到您的桌面。

在此处输入图片说明


1
我不得不将图标拖到文本编辑器上,台式机对我不起作用。
科里·克莱因

2
对于Windows上的Chrome,单击“查看证书”后,模式将不同于Mac。单击“详细信息”选项卡,然后单击“复制到文件...”,然后选择格式和文件名,这很简单。
PolyTekPatrick

1
在Mac OS上使用Chrome v63时,通过拖动证书得到的文本文件是人类可读的,但不是任何可以理解为如何转换为机器可读形式的结构化格式,例如X.509 .crt。
Jim DeLaHunt

从地址栏或从这个开发选项卡打开都没有区别,并且仍然无法下载crt ...
user25

1
在Chrome 72.0.3626.121上无法正常工作
A. D'Alfonso

20

这是gbroiles的回答,但我想指出的是,卷曲的项目有更多的一些细节页面上使用openssl,以节省远程服务器的SSL证书:

  • openssl s_client -connect {HOSTNAME}:{PORT} | tee日志文件
  • 类型QUIT,然后按Enter / Return键。
  • 该证书将列在“ BEGIN CERTIFICATE”和“ END CERTIFICATE”标记之间。
  • 如果要查看证书中的数据,可以使用:

    openssl x509-通知PEM-输入certfile-文本-out certdata

    certfile从中提取的证书在哪里logfile?看看certdata


这对我有用。为了更加明确,我编辑了日志文件并修剪了BEGIN CERTIFICATE和END CERTIFICATE之外的所有内容,并将结果保存为certfile.pem(不确定扩展名是否必要)。
Michael Welch,

16

自动化的

-servername是我从服务器上的虚拟主机获取正确证书所必需的。

openssl s_client -showcerts -connect host.name.com:443 -servername host.name.com </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > host.name.com.pem

您也可以转换为台式机证书

openssl x509 -inform PEM -in host.name.com.pem -outform DER -out host.name.com.cer

最后一部分是将其添加到您的证书中,不确定在Windows上
我使用的Mac钥匙串是否应该类似...

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain host.name.com.cer



请注意,某些应用程序在使用System和SystemRoot钥匙串时遇到麻烦(Golang,我在看着您),因此在安装和设置这些级别的信任后,您可能还希望login.keychain通过Keychain Access应用程序将其复制到自己用户的账户中。只需浏览到System / SystemRoot中的证书,然后单击并将其拖到login钥匙串中即可。
dragon788

1
@ dragon788-我的意图是使用命令行将其自动化,这对我有用。如果您还通过CLI找到了login.keychain的解决方案,请在这里分享!谢谢!
Artistan

从我在网络上阅读的内容来看,我相信只是-d从命令中省略掉将仅适用于用户钥匙串而不是系统钥匙串。
dragon788

如果您还要添加中间证书,则要使用它trustAsRoot而不是trustRoot为了正确添加中间证书。
dragon788 '18

2

这将给出仅包含证书的结果

echo QUIT | \
openssl s_client -showcerts -connect hostname:port | \
awk '/-----BEGIN CERTIFICATE-----/ {p=1}; p; /-----END CERTIFICATE-----/ {p=0}' "

0

如果在Windows上找到了一种更简单的方法。尝试使用Microsoft Edge(预铬),然后单击地址栏中的锁->“查看证书”对话框弹出,带有“导出到文件”按钮,将其另存为.crt文件。

我不会用Edge做很多事,但这只是小菜一碟。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.