第08课:淘宝、京东

第08课:淘宝、京东 SSL 证书背后鲜为人知的秘密

SSL 证书主要用来保护客户端(比如浏览器、手机 App)与服务器之间的通信安全,通过在信息传输之前,加密传输的内容,从而保护通信内容不被窃听。在这过程中,SSL 证书起到了非常关键的作用。一般来说,SSL 证书的名字应该严格和需要访问的目标站点的域名严格匹配上,否则我们就要怀疑其证书是否是伪造的,比如,在 IE 中可以通过点击浏览器上方的锁来查看百度证书,如下图所示意,百度的证书就是颁发给百度网站的,没有什么特别的,其证书就是颁发给 baidu.com 这个网站的域名的。如果我用颁发给 baidu.com 这个证书,来部署别的网站的 SSL 服务器,比如,www.51talkdocter.com,这个时候浏览器可能就会报错了,因为 SSL 证书的通用名字和网站的 URL 地址中的域名匹配不上。于此同时,淘宝和京东的证书,却有点特殊,其一个 SSL 证书竟然可以被几十个甚至上百个网站共用,而浏览器去不报异常,这是怎么回事?谜底即将揭晓。

enter image description here

查看淘宝的 SSL 证书

下面来看看 taobao 网站的 SSL 证书,比较特殊,而且非常的特殊,访问的站点和证书名字竟然匹配不上。

enter image description here

上面百度的网站是用 IE 打开并查看 SSL 证书的,下面笔者用 Chrome 打开 taobao 的网站,如果是 Chrome 浏览器,在最新的 Chrome 浏览器,可以通过按下 F12 的键(或者鼠标点击右键:检查),然后在安全(Security)子页面来查看其证书,比如淘宝的网站,我用 Chrome 查看其证书,很奇怪的是,我打开的 URL 地址为 https://www.taobao.com 的淘宝网站,结果其证书却是颁发给天猫的(*.tmall.com),那这个就很奇怪了,证书的名字和竟然要访问的网站的名字对不上了,那这个网站还安全吗?先暂且不表,请继续看京东网站的 SSL 证书。

查看京东的 SSL 证书

用和打开百度网站同样的方法,我们用 IE 打开京东的网站地址,通过单击右边的小锁按钮,可以查看京东的 SSL 证书。

enter image description here

初步一看没有问题,证书就是颁发给域名后缀为 jd.com 的所有网站以及子域名网站的,而且我们访问的也是 https://www.jd.com 的网站。

紧接着我们单击京东 SSL 证书的“Details”页面,然后再单击 “Subject Alternative Name”(简称 SAN),将会惊奇的发现,这个属性的值竟然有几十个网站站点的域名。

enter image description here

难道京东的这几十个网站都共用同一个 SSL 证书吗?

一张证书通配多个网站的秘密

首先来回答对淘宝和京东网站 SSL 证书的两个问题:

  • 淘宝证书的名字和竟然要访问的网站域名名字对不上了,那这个网站还安全吗?
    • 答案是肯定的,肯定安全,因为这是 X509 新增加的一个扩展属性。
  • 京东的这几十个网站都共用一个 SSL 证书吗?
    • 答案也是肯定,就是共用一张 SSL 证书。

那为什么 x509 标准委员会会增加这个“Subject Alternative Name”属性呢?原来,X509 技术标准委员会考虑到下面的这样的一种业务场景:

比如说,有一个大型互联网公司,其可能有几十个甚至上百个公共或者内部的互联网站点,如果给每一个站点都申请一个证书,那么就要维护几十个甚至上百个公共的互联网站点的 SSL 证书,如果一旦某一个站点的证书没有部署对,那么就可能导致这个站点的 HTTPS 的访问不受信任,从而造成维护和管理的高成本。考虑这种情况,其给 SSL 的证书加了一个新的扩展属性,Subject Alternative Name(翻译成中文就是:可替换名称),使用了 SAN 字段的 SSL 证书,可以扩展此证书支持的域名,使得一个证书可以支持多个不同域名的解析。说的白话一些就是,我可以把当前的一个证书,供多个域名站点共同使用。反过来,通过查这个字段的值,我们还能知道这个证书被那些域名共同使用了,从而发现一些平常我们不知道的一些淘宝京东网站的地址,比如下面就是从淘宝的 SSL 证书上看到的其支持通配的域名站点。

enter image description here

enter image description here

当然,每个硬币都有正反两面,这个其实也是一把双刃剑,虽然维护方便了,但是安全风险也大大的提高了,试想如果淘宝京东的 SSL 证书的私钥一旦被攻破或者盗取,那所有的共用这个 SSL 证书的网站的信息将会在传输的过程中犹如皇帝的新装一样,在掌握这个私钥的黑客手中,通过这个证书加密的信息将会一丝不挂,后果不堪设想,但是也许我们是杞人忧天,因为淘宝京东肯定有这个实力来保存这个公共证书的私钥的。

申请包含多个域名的 SSL 证书

既然这个信息这么的有用,那么我们如何用 OpenSSL 申请包含多个域名的证书呢?比如,我们要为下面的站点申请同一张 SSL 证书。

  • 51talkdocter.com
  • 51talkITExpert.com
  • abcd.com

那应该如何做呢?假设我们还是接着使用在《如何用 OpenSSL 搭建 CA 认证中心的中级 CA 证书》一文中的环境和中级证书来签署多个域名的 SSL 证书请求。

生成证书请求私钥

打开 cmd,然后使用 cd C:\rootca-example 命令进入这个目录,然后在输入 openssl。

enter image description here

下面先生成一个证书请求的私钥。

genrsa -aes256 -out intermediate/private/talkdocter.key.pem 2048

输出结果如下:

enter image description here

生成证书请求

把在文章《如何用 OpenSSL 搭建 CA 认证中心的中级 CA 证书》中提到的 C:\rootca-example\intermediate 目录下的 openssl.cnf 的文件拷贝一份并重命名为 talkdocter.cnf,并加入下面的内容。

enter image description here

通过下面的命令,创建一个证书请求:

req -config intermediate/talkdocter.cnf -key intermediate/private/talkdocter.key.pem  -new -sha256 -out intermediate/csr/talkdocter.csr.pem

注意,其使用的是新创建的 talkdocter.cnf 这个配置文而不是 openssl.conf 文件。

其输出结果如下:

enter image description here

打开目录 C:\rootca-example\intermediate\csr,发现 talkdocter.csr.pem 的证书请求已经生成。

enter image description here

签署证书请求

通过下面的命令签署证书请求。

ca -config intermediate/talkdocter.cnf  -extensions server_cert -days 375 -notext -md sha256  -extensions req_ext  -in intermediate/csr/talkdocter.csr.pem  -out intermediate/certs/talkdocter.cert.pem

请注意,-extensions reqext 参数中的值“reqext”,必须和 talkdocter.cnf 中的新加的[ reqext ]中名字一样,必须为 reqext,否则 CA 签名后,其“Subject Alternative Name”扩展属性就不会出现。

其命令执行过程中的输出如下:

enter image description here

生成后,把生成的 SSL 证书 C:\rootca-example\intermediate\certs\talkdocter.cert.pem 改名成 talkdocter.cer,并在 Windows 操作系统上打开,并点击详情(Details)页面,我们可以看到在“Subject Alternative Name”扩展属性中,就出现了下面的三个 DNS 的名字。

  • 51talkdocter.com
  • 51talkITExpert.com
  • abcd.com

enter image description here

总结

这篇文章主要通过查看淘宝、京东的证书,发现淘宝和京东的证书的 Subject Alternative Name 属性字段比较特殊,其里申明了多个站点,而且这些站点共用一个 SSL 证书,从而减少了维护的成本,当然于此同时也增加了网站的安全风险,但是如果只要其私钥能够被完美安全的保存,问题还是不大的。最后通过使用 OpenSSL 工具,用一个具体的例子实战了一把,在证书申请里面加入了“Subject Alternative Name”这个属性,并用中级证书的 CA 签名成功!最后祝大家学习愉快。

上一篇
下一篇
目录