第07课:三种方法从

第07课:三种方法从 HTTPS 网站导出 SSL 证书链

现在互联网上基于 HTTPS 的 Web 站点或者 Web 应用已经成为主流,比如微信就强制要求开发者访问的后台 API 的服务必须使用 HTTPS 而不能使用 HTTP。

与此同时,用 Java、.NET、Python、PowerShell 等语言开发的应用程序的时候,比如访问 HTTPS 的 Web 站点爬取网页内容或者调用第三方的基于 HTTPS 的 API 的时候,为了验证被访问的 HTTPS 站点的名称(Host Name)是可信任的,这个时候,往往要先把颁发 Web 服务器的 SSL 证书的 CA 证书链导出到本地,转换成某种形式的输入,比如导入到 JDK 的 Security 的可信任列表中,或者在编程语言实际调用 HTTPS 的网站 URL 地址的时候,把为 Web 服务器颁发 SSL 证书的 CA 证书链制定到某个配置参数,这个时候客户端才能成功访问系统网站。

那么有什么好的方法和工具能够帮助我们快速的需要访问的网站上把 CA 证书导出来呢?方法有很多种,其主要的有以下三种,下面一一介绍。

  • 浏览器导出
  • 开源工具 Portecle 导出
  • OpenSSL 导出

浏览器导出

个人感觉,IE 浏览器对于 SSL 证书的管理和导出做的还是挺专业和强大的,所以我们将借助于 IE 浏览器来帮助我们导出 HTTPS 网站的 CA 证书链,下面以导出京东站点的 SSL 证书链为例子,看咱们是如何通过 IE 浏览器来导出 SSL 证书链的。

Step 1:用 IE 浏览器打开 https://www.jd.com 站点,然后点击浏览器地址栏最右边的锁,其就会弹出一个窗体,点击查看证书(View Certificate)按钮,其网站的 SSL 证书的基本信息就一目了然了。

enter image description here

Step 2:点击上图中的安装证书(Install Certificate)按钮,就会弹出一个新的窗体,我们直接单击“下一步(Next)”按钮。

enter image description here

Step 3:选择第一个选项,自动根据证书类型进行存储,然后单击“下一步(Next)”按钮:

enter image description here

Step 4:单击“完成(Finish)”按钮,证书已经导入到个人(Personal)SSL 证书存储中心。

enter image description here

上面的四个步骤已经把证书已经导入 Windows 操作系统的 SSL 证书存储中心,下面将具体演示如何将导入的证书导出来。

Step 5:打开 IE 浏览器,依次单击“工具(Tool)”菜单 | Internet 选项(Internet Options)命令,其会弹出一个 Internet 选项(Internet Options)的对话框。

enter image description here

Step 6:点击上面的“证书”(Certificates)按钮,然后单击“其他人”(Other People)选项卡,我们发现 *.jd.com 的证书已经存在了。

enter image description here

Step 7:选中“*.jd.com”证书,然后单击下方的“导出”(Export)按钮,然后一直单击“下一步”(Next)按钮,直到出现下面的类似界面。

enter image description here

其会让你选择要导出的证书格式,如下。

(1)二进制格式的 CER

导出后,后缀名为 .cer,但是用记事本打开的时候,可以看到是乱码,因为其是以二进制的格式存储证书的。

(2)Base-64 格式的 CER

导出后,后缀名为 .cer,但是用记事本打开的时候,可以看到其是一些用字母和数字组成的内容,那是因为其对二进制的证书内容进行了 Base-64 编码。一般在配置 Nngix 等 Web 服务器的时候,其支持的就是 Base-64 格式的证书,如果不是就会配置失败。

(3)P7b

主要是用来导出证书链证书,我们当前的例子就会使用这种方式。

(4)PFX(P12)

P12 的不仅仅能导出证书链,还能导出私钥,功能比 p7b 更强大,因为有私钥,所以导出的时候,会有弹出框让用户输入保护私钥的密码。

(5)SST

这个是微软特有的一种串行化的证书存储容器,有点类似于 Java 的 JKS,一般不太常用,我们可以暂且忽略它。

我们选择第三种,导出成为 p7b 格式。

Step 8:选择导出的 p7b 证书的路径,比如 c:\ssldemo\jdSSLChain.p7b:

enter image description here

Step 9:然后一直单击“下一步”(Next)按钮,直到完成。

enter image description here

Step 10:双击 c:\ssldemo\jdSSLChain.p7b 证书,则 Windows 操作系统将会自动把其打开,我们发现,*jd.com证书,颁发*jd.com 证书的中级证书,颁发 *jd.com 证书的根证书都已经存储在 p7b 文件当中了,是不是很神奇!

enter image description here

开源工具 Portecle 导出

上面是在 Windows 操作系统里面,如果在非 Windows 的操作系统里面,因为没有了 IE 浏览器,那我们应该如何导出 HTTPS 网站上的 SSL 证书链呢?

幸运的是,当前我们程序员生活在一个幸福的世道,在程序员的世界中,有很多热心人,喜欢分享,也喜欢开源自己的软件作品共别的程序员无偿使用,人人多献出一份爱,从而让这个世界变得更加的美好,这不,就有热心于开源项目的行业人士为我们提供了一个方便简单的工具:Portecle,来帮助我们。利用这个工具能轻松的从 HTTPS 网站上导出 SSL 的 CA 证书,当然这个工具能做的事情远远不止导出证书,还能做的别的事情,比如把证书导入到 JKS 文件中,查看 JKS 文件中的私钥和证书,因为本章的重点是分享如何导出 HTTPS 网站的 SSL 证书链,所以只局限于如何使用 Portecle 帮助 HTTPS 网站导出 SSL 证书链,对于其他功能,我相信聪明的读者肯定能举一反三的。

OK,不和大家饶弯子了,直接进入实战操作步骤。

Step 1:下载该软件,直接单击这里下载软件,当前最新的版本是 1.10。

Step 2:下载完后,解压缩后,目录结构如下: enter image description here

Step 3:安装 JDK 后,在环境变量里面配置 JAVA_HOME(具体步骤,请在 Google 或者百度里面搜索“java home 设置”)因为不是本节的重点,这里不再赘述。

配置完后,双击 portecle.jar 文件,如上图,将会弹出下面的界面。

enter image description here

Step 4:点击下面的菜单项 Examine -> Examine SSL/TLS Connection” ,弹出“Examine SSL/TLS Connection” 窗体。

enter image description here

Step 5:咱们以访问百度的网站(https://www.baidu.com/)为例子,输入如下图所示意的参数,然后单击 OK 按钮,将会弹出 Step 6 中所示意的窗体。

enter image description here

Step 6:在弹出的证书详情的窗体中,可以看到下面的界面,见下图:

enter image description here

Step 7:在 Step 6 附图中的“PEM Encoding”按钮,将会弹出下面的窗体。

enter image description here

Step 8:单击“Save”按钮,保存证书。

enter image description here

Step 9:单击 Step 6 页面顶端的右向箭头(-->),重复 Step 7~8,把剩下的两个证书也导出来。

至此,恭喜各位看官,你的 HTTPS 的 SSL 的 CA 证书导出成功了。

OpenSSL 导出 CA 证书链

其实上面的两个可视化工具已经足够我们使用了,但是有的时候,我们可能要开发一些自动化的程序,比如自动化的测试程序,当目标 HTTPS 的站点在不断的变化时,我们预先可能不知道将要访问哪个 HTTPS 的站点,也许是互联网上的站点,也许是企业内部的站点,也许是自签名证明,那这个时候,我们可能要亮出 OpenSSL 这个神器了,OpenSSL 在 SSL 证书管理的江湖中,应该相当于少林寺这种重量级角色,天下武功皆出少林,少有 OpenSSL 在 SSL 证书界有干不了的事情,而且其本身就是用命令来进行操作的,所以非常方便的和第三方应用程序进行集成使用。

现在我们就具体看看 OpenSSL 是如何导出一个网站的 SSL 证书链的,还是以访问京东的网站为例子,并假设已经安装好了 OpenSSL 程序,笔者的例子是运行在 Windows 操作系统上,当然在非 Windows 操作系统,比如 Ubuntu 的操作系统上,命令和方法都是类似的。

Step 1:打开 OpenSSL 界面。

Step 2:在 OpenSSL 的命令窗体中输入下面的命令:

s_client -showcerts -connect www.jd.com:443

其就会把 https://www.jd.com 站点的 SSL 证书链列出来,如下图所示意。

enter image description here

Step 3:把所有出现了“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”的之间字符串包括“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”进行逐一复制,然后另存为到一个以 cer 结尾的文件中。

enter image description here

Step 4:类似的我们把 *.jd.com 的颁发者 GlobalSign Organization Validation CA 也以类似的方式存储为 GlobalSign Organization Validation CA.cer:

enter image description here

Step 5:心细的读者也已经发现了,当我们用 OpenSSL 的时候,其实我们只能导出证书链中的中级证书和服务器本身的证书,不能导出其 Root CA 的证书,那这是为什么呢?原来在 HTTPS 的通信过程中,如果服务器的证书包含很多的层级的话,其一般发出两个层级的证书,也就是把当前 Web 服务器本身的 SSL 证书和颁发这个 Web 服务器的 SSL 证书发送到客户端,如果还有一个层级,其就不会发过来了,这就是为什么 OpenSSL 的客户端只能显示出两个 SSL 的证书的原因了。如果我们换成了 https://www.12306.cn 网站,因为其只有两个层级,所以能把其所有的证书都显示出来,如下面的两个图。

enter image description here

enter image description here

总结

上面介绍了三种导出 HTTPS 服务器端证书链的方法,其中 OpenSSL 工具有一个小小的遗憾的地方,但是读者不需要担心,一般来说服务器端的 SSL 出现了三个层级,一般都是世界上知名的 CA 中心颁发的,大部分情况下操作系统或者浏览器或者 JDK 的 Security 的证书列表等应该都已经有他们存在了,所以程序的 SSL 验证一般都会自动通过,如果有特例的话,就请用 IE 导出其第三级以及其上的根证书。大家有任何的问题或者疑惑,请在我们的读者圈里面留言,由于时间和水平有限,如果有任何纰漏之处,还请告知,从而让我及时更正,最后祝大家学习愉快。

上一篇
下一篇
目录