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

这是用于办公室通讯的,所以我不能真正使用实际的客户端来获取证书。所以任何工具/脚本语言都可以。

评论

要获取邮件服务器的证书,请参阅security.stackexchange.com/questions/70528/…

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

#1 楼

如果您可以访问OpenSSL,请尝试使用任意值替换

评论


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

–bramp
2012年1月23日在21:14

另外,它适用于HTTP以外的协议。

–马特
2013年12月3日15:49

elec3647的解决方案完全自动化了在外壳管道中提取PEM的过程。

–phs
13-12-10在7:05



443是HTTPS的默认端口。

– Flimm
16年11月2日,10:40

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

–Artistan
18年1月25日在16:00

#2 楼

获取和下载证书的一种快速方法是运行以下命令,该命令将-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


评论


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

– Monojohnny
2014年8月30日在20:42

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

– Janusz
2014年9月9日在9:05

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

–迈克尔·蒙西(Michael Munsey)
2014年12月2日23:51

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

–dave_thompson_085
16年8月11日在21:13



使用wget似乎只保存index.html =>发送的HTTP请求,等待响应... 200 OK长度:未指定[text / html]保存到:‘index.html.1’

– OZZIE
17-10-25在7:53

#3 楼

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


单击以下位置的SSL证书图标顶部,底部单击。
单击View Certificate

单击Details选项卡
从层次结构中选择所需的证书[未在图中圈出]
单击Export




评论


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

– William Hilsum
2010年1月18日在8:49

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

– gbroiles
2010年8月17日在7:23

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

– William Hilsum
2010年8月17日在9:59

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

– gbroiles
2010年8月18日在6:43



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

– fatuhoku
16年2月11日在16:52

#4 楼

使用Chrome浏览器导出证书


使用SSL(https:// whatever)

连接到网站
2。单击锁定符号,然后单击“详细信息”。



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

单击“查看证书”按钮。

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

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

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

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

请参见下面的屏幕快照。


要导出证书,请执行以下操作:


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





评论


我不得不将图标拖到文本编辑器上,台式机对我不起作用。

– Cory Klein
17年5月4日在19:23

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

–PolyTekPatrick
17年8月30日在12:06



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

– Jim DeLaHunt
17年12月19日在2:06

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

–user25
18年3月31日,0:32

在Chrome 72.0.3626.121上不再可用

– A. D'Alfonso
19年3月13日在10:11

#5 楼

这是gbroiles的答案,但我想指出的是,cURL项目中的页面包含有关使用openssl保存远程服务器的SSL证书的更多详细信息:


openssl s_client -connect {HOSTNAME}:{PORT} | tee logfile

键入QUIT,然后按Enter / Return键。
证书将列在“ BEGIN CERTIFICATE”和“ END CERTIFICATE”标记之间。

如果要在证书,您可以使用:

openssl x509 -inform PEM -in certfile -text -out certdata


其中certfile是从logfile提取的证书。查看certdata



评论


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

– Michael Welch
18-10-25在19:52

#6 楼

自动化

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

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

评论


gist.github.com/Artistan/5219484efb2fe51cd064175b3d0d5971

–Artistan
18年1月25日在15:59

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

–dragon788
18年11月20日在22:45

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

–Artistan
18年11月21日在17:17

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

–dragon788
18年11月28日在21:18



如果您还要添加中间证书,则要使用trustAsRoot而不是trustRoot以便正确添加证书。

–dragon788
18年11月29日在18:20

#7 楼

这将只给出包含证书的结果。
echo QUIT | \
openssl s_client -showcerts -connect hostname:port | \
awk '/-----BEGIN CERTIFICATE-----/ {p=1}; p; /-----END CERTIFICATE-----/ {p=0}'


评论


我认为末尾的双引号可以省略。

–哈珀维尔
10月30日,下午1:54

#8 楼

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

我不会用Edge的,但这只是小菜一碟。