深入剖析 SSL 证书

各位好!在我的网络杂志(大家很快就能看到了)中,有一页是关于 TLS/SSL 的。但是,当你在一页纸上就一件事写上 200 个字时,就会发现还有很多有趣的东西要说。因此,在这篇文章中,我们将剖析 SSL 证书,并尝试理解它!

我不是一个专职的互联网安全从业者,也不会为你的网站提供安全建议。但是我认为,了解签发 SSL 证书的过程是一件很有趣的事情,我可以在这里谈谈我的看法。

TLS:新版的 SSL

我很长时间都搞不清 TLS 是什么东西。通常,较新版本的 SSL 称为 TLS(即 SSL 3.0 之后的版本是 TLS 1.0)。因此,我打算始终用 SSL 来称呼它,因为这对我来说不那么令人困惑。

什么是证书?

假如我在 https://mail.google.com 来检查我的新邮件。

mail.google.com 运行在 HTTPS 服务器上并使用 443 端口。我需要确认我确实访问的是 mail.google.com 而不是其他恶意用户所拥有的服务器。

在很长一段时间里,certificate —— 证书 —— 这个东西对我来说都很神秘。有一天,我的同事告诉我,我可以用命令行连接到服务器并下载它的证书!

说明:如果只想查看 SSL 证书,可以点击浏览器中的绿色锁图标,可以获取关于网站证书的全部信息。另外,本站也提供了SSL证书验证工具,可以以直观的方式查看网站(域名)的证书信息。

现在,让我们从 mail.google.com 的证书开始,对其进行一番解构。

首先,我们运行 openssl s_client -connect mail.google.com:443 这一条命令。

这将打印一堆东西,但我们只关注证书相关的部分。如下所示:

$ openssl s_client -connect mail.google.com:443
...
-----BEGIN CERTIFICATE-----
MIIElDCCA3ygAwIBAgIIMmzfdZnO9pMwDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE
BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl
cm5ldCBBdXRob3JpdHkgRzIwHhcNMTcwMTE4MTg1MjExWhcNMTcwNDEyMTg1MDAw
WjBpMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEYMBYGA1UEAwwPbWFp
bC5nb29nbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiYcr
C9Rn7g9xjsg7khqfRPxUnvpgGyCHqJMXxZGtdf+G02d07cPlMEeaGG12vHyVfRZD
tc/F1ZfwenH6gf0uMobtgw7n2NQa7T7qxuqSUDhZsO1sI1LL/Yqy8QHoooOZQWMz
ytuRA18zti4vQV1dCijADh0+NWI1GDUAKidbaH/fBRrStqBev5Bhq3ZaGj3fDjAO
7CG0Wk3n4Ov2yg44XOdgkLMzjdnbV8l6cZDC7lCK1VsEU1mEd0O0Dw4OcnHLuBPw
IkioZayhPOXDXUS+bhpmtEiCkt8kbHG6jNMC4m8t62Jaf/Si3XNcHhDa4wPCTvid
X//PuuNlRZVg3NjK/wIDAQABo4IBXjCCAVowHQYDVR0lBBYwFAYIKwYBBQUHAwEG
CCsGAQUFBwMCMCwGA1UdEQQlMCOCD21haWwuZ29vZ2xlLmNvbYIQaW5ib3guZ29v
Z2xlLmNvbTBoBggrBgEFBQcBAQRcMFowKwYIKwYBBQUHMAKGH2h0dHA6Ly9wa2ku
Z29vZ2xlLmNvbS9HSUFHMi5jcnQwKwYIKwYBBQUHMAGGH2h0dHA6Ly9jbGllbnRz
MS5nb29nbGUuY29tL29jc3AwHQYDVR0OBBYEFI69aYCEtb2swbJJR3cMOTdcfvZ4
MAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUSt0GFhu89mi1dvWBtrtiGrpagS8w
IQYDVR0gBBowGDAMBgorBgEEAdZ5AgUBMAgGBmeBDAECAjAwBgNVHR8EKTAnMCWg
I6Ahhh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3JsMA0GCSqGSIb3DQEB
CwUAA4IBAQAhiqQIwkGp1NmlLq89gjoAfpwaapHuRixxl2S54fyu/4WOHJJafqVA
Tya9J7GTUCyQ6nszCdVizVP26h9TKOs9LJw5jWV9SOnPU2UZKvrNnOUi2FUkCcuD
lsADdKSXNzye3jB88TENrWC/y3ysPdAgPO/sXzyRvNw8SVKl2+RqMDpSRpBptF9e
Lp+WLAM3xKS5SPwCNdCiA332o7qiKRKQm/6bbIWnm7hp/ZnLxbyKaIVytRdiwRNp
O/TTpRv2C708GA3PH6i1pYE86xm3w7lGhN9OiCZpKOJD6ZUH3W20idgPKYPBCO/N
Op2AF3I4iUGeQjXFVLgS6mjUvdLndL9G
-----END CERTIFICATE-----

上面都是一些难懂的字符,“MIIElDcca......”,这是啥?

这其实是一种叫做 X509 的格式,openssl 命令知道如何对其解码。

于是,我把这段文本保存到一个名为 cert.pem 的文件中。如果你想跟着学,你可以把这段字符下载下来,然后保存到你的电脑上。

接下来,我们就来解析这个证书。运行如下命令:

$ openssl x509 -in cert.pem -text

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 3633524695565792915 (0x326cdf7599cef693)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=Google Inc, CN=Google Internet Authority G2
        Validity
            Not Before: Jan 18 18:52:11 2024 GMT
            Not After : Apr 12 18:50:00 2024 GMT
        Subject: C=US, ST=California, L=Mountain View, O=Google Inc, CN=mail.google.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:89:87:2b:0b:d4:67:ee:0f:71:8e:c8:3b:92:1a:
                    9f:44:fc:54:9e:fa:60:1b:20:87:a8:93:17:c5:91:
                    .... blah blah blah ............
                    c2:4e:f8:9d:5f:ff:cf:ba:e3:65:45:95:60:dc:d8:
                    ca:ff
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Alternative Name: 
                DNS:mail.google.com, DNS:inbox.google.com

            X509v3 Subject Key Identifier: 
                8E:BD:69:80:84:B5:BD:AC:C1:B2:49:47:77:0C:39:37:5C:7E:F6:78
    Signature Algorithm: sha256WithRSAEncryption
         21:8a:a4:08:c2:41:a9:d4:d9:a5:2e:af:3d:82:3a:00:7e:9c:
         1a:6a:91:ee:46:2c:71:97:64:b9:e1:fc:ae:ff:85:8e:1c:92:
         ......... blah blah blah more goes here ...........

这里面有很多东西。以下是我理解的部分:

  • CN=mail.google.com`是表示通用名称(CN 表示 Common Name)。与直觉相反,你应该忽略这个字段,转而查看主题备选名称(Subject Aalternative Name)字段
  • 过期时间:2024年4月12日 18:50:00
  • X509v3 Subject Alternative Name:此部分列出了该证书适用的域名列表。这里是 mail.google.com 和 inbox.google.com,它们都是 Google 电子邮件使用的域名。
  • 在 Public Key Info 部分,我们将使用公钥与 mail.google.com 通信。由于时间关系,这里不会展开讲解公钥密码学的知识,但这基本上就是我们用来通信的加密密钥。
  • 最后,签名非常重要。基本上,任何人都可以为 mail.google.com 制作证书。我现在就可以生成一个。但如果我把证书给了你,你没有足够的理由相信它是真的 mail.google.com 域名的证书。

下面,让我们来谈一谈证书签名。

证书签名

互联网上的每张证书基本上都由两部分组成:

  1. 证书(有效域名、公钥和其他信息)
  2. 他人签名。这基本上就是说,“嘿,这没问题,Visa 是这么说的”。

在我电脑的 /etc/ssl/certs 文件夹里有一堆证书。这些证书是我的电脑信任的,可以签署其他证书。例如,我的笔记本电脑上有 /etc/ssl/certs/Staat_der_Nederlanden_EV_Root_CA.pem 这个证书,它是来自荷兰的 SSL 证书。谁知道呢?如果他们签署的是 mail.google.com 证书,我的电脑就会说:是啊,看起来不错,听起来也很棒。

如果街对面随便一个人在证书上签名,我的电脑就会说“我不知道你是谁”,并拒绝接受证书。

mail.google 证书:

  • s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=mail.google.com
  • 由 “Google Internet Authority G2” 签署
  • 由 “GeoTrust Global CA“ 签署
  • 由 ”Equifax 安全证书颁发机构“ 签署

我的电脑上有一个 /etc/ssl/certs/GeoTrust_Global_CA.pem 文件,我想这就是我信任 mail.google.com 证书的原因。(Geotrust 签署了 Google 的证书,而 Google 签署了 mail.google.com)

签发证书的过程是怎样的?

当你获得证书时,基本流程如下:

  1. 生成证书的前半部分(这部分是公开的)
  2. 同时,为证书生成私钥。私钥需要将其妥善保管,不要向任何人展示,每次建立 SSL 连接时都要使用该密钥
  3. 你向其他计算机信任的证书颁发机构(CA)付费,由其为你签署证书。证书颁发机构应该具有基本的职业操守,确保在签署证书时,证书颁发者确实拥有该域名
  4. 你用签名证书配置你的网站,并用它来证明你确实是你自己的

我认为,“证书颁发机构应该具有基本的职业操守” 是人们在出现赛门铁克公司的类似问题时如此疯狂的原因,在这些问题中,他们生成的测试证书指向了未注册的域名和赛门铁克公司未获得授权的域名"。

证书透明度

最后,我们要谈的是证书透明度。这是一个非常有趣的话题,有一个很好的网站,我几乎肯定会搞砸它。

不管怎样,我还是要试试!

所以,我们说证书颁发机构“应该具有基本的职业操守”。但我的电脑信任的证书颁发机构多如牛毛,它们中的任何一家都有可能为 mail.google.com 签发伪造证书 —— 这可不行。

这不是一个假设的问题 —— 证书透明度网站上不止一次提到过 CA 被泄露或出错的情况。

所以,情况是这样的:在任何时候,谷歌都知道 mail.google.com 的所有有效证书(可能只有一个)。因此,证书透明度通常是一种方法,该方法可以确保即便有他们不知道的 mail.google.com 证书在流通,他们也能发现(这种情况)。

以下是我所理解的证书透明度的工作步骤:

  1. 每当任何证书机构签发证书时,他们都应该将其存入全球公共证书日志
  2. 此外,Googlebot 也会把它在互联网上找到的每张证书都放到证书日志中
  3. 如果证书不在日志中,那么浏览器就不会认可它(或者,将来某个时候不再认可它)
  4. 任何人都可以随时查看日志,以发现其中是否有恶意证书

因此,如果位于荷兰的证书机构签署了一份非法的 mail.google.com 域名证书,他们要么把它放在公共日志中(Google 会发现这种非法方式),要么就不把它放在公共日志中(这样浏览器将会拒绝它)。

设置 SSL 是件难事

OK!我们已经下载了一份 SSL 证书,并对其内容进行了剖析,了解了一些相关知识,希望你们也从中学到一些东西。

在网络服务器上为 SSL 证书和 SSL 配置选择正确的设置非常令人困惑。据我所知,大约有 30 亿种设置。下面是一个 SSL 实验室对 mail.google.com 的结果示例。在该页面上,有诸如 OLD_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 之类的设置。我很高兴有 SSL Labs 这样的工具可以帮助凡人理解这一切。

有人告诉我,如果你不确定该怎么做,https://cipherli.st/ 是一种选择安全 SSL 配置的方法。我不知道它好不好。

Let’s Encrypt 是不错的选择!

此外,let's encrypt 也非常酷!你甚至不需要了解证书的内部工作原理就能获得一张 SSL 证书——而且是免费的。

分享