TLS:SSL的新版本
我很长一段时间都不知道“TLS”是什么。基本上,SSL的新版本被称为TLS(SSL 3.0之后的版本是TLS 1.0)。我将始终称之为“SSL”,因为这对我来说不那么令人困惑。
什么是证书?
假设我mail.google.com 查看email信息。mail.google.com 运行在443端口上。
这种“证书”对我来说很长一段时间都很神秘。有一天,我的同事Ray告诉我,可以通过命令行连接到服务器并下载它的证书!
(If如果您只想查看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-----
到目前为止,不能理解这段字符的含义。
事实上,这种无意义的格式称为“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 2017 GMT
Not After : Apr 12 18:50:00 2017 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是“通用名”。与直觉相反,您应该忽略此字段,转而应该查看“subject alternative name”字段- 失效日期:2017年4月12日18:50:00 GMT
X509v3 Subject Alternative Name:部分包含此证书适用的域列表。这里是mail.google.com和inbox.google.com。Public Key Info部分告诉我们用于与mail.google.com通信的公钥。- 最后,signature(签名)是一件非常重要的事情。基本上任何人都可以为mail.google.com制作证书。
接下来,让我们来谈谈证书签名。
证书签名
互联网上的每个证书基本上都是两个部分构成:
- 证书(它的有效域名,公钥和其他东西)
- 别人的签名。(A signature by someone else.)
我的电脑上有一堆证书,在/etc/ssl/certs目录中。这些是我的计算机信任的证书,可以用来签署其他证书。例如,我的笔记本电脑上有 /etc/ssl/certs/Staat_der_Nederlanden_EV_Root_CA.pem 。如果他们签署了一个 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 Secure Certificate Authority认证
我的电脑上有一个/etc/ssl/certs/GeoTrust_Global_CA.pem文件,我想这就是我信任此mail.google.com证书的原因。
获取证书颁发的过程是怎样的?
当你得到一个证书,它的获取过程是什么样的:
- 生成证书的前半部分(“jvns.ca!在X日期过期!这是我的公钥!”)。这部分是公开的。
- 与此同时,证书生成私钥。你要保守秘密,不要给任何人看。每次建立SSL连接时都将使用此密钥。
- 您需要向其他计算机信任的证书颁发机构(CA)支付费用,以使他们为您签发证书。证书颁发机构理应具备公信力,因此在颁发证书时,他们应当确保将证书颁发给实际拥有该域名的人。
- 您可以使用您的签名证书配置您的网站,并使用它来证明你真的是你!
我认为,正是由于“证书颁发机构理应具备公信力”这一原则,才会导致当出现类似赛门铁克为未注册域名或未经域名所有者授权的域名生成测试证书这类问题时,人们会如此愤怒。
证书透明度
最后我们要讨论的是证书透明性。
因此,我们说证书颁发机构“应该具有完整性”(supposed to have integrity)。但是我的计算机信任的证书颁发机构太多了!在任何时候,他们中的一个都可以为mail.google.com签署一个流氓证书。这可不好
这不是一个假设性的问题-证书透明度网站讨论了不止一个CA被泄露的情况。
事情是这样的。在任何时刻,谷歌都应当知道mail.google.com(可能只有一个或几个)的有效证书。因此,证书透明度机制本质上是一种方式,用以确保当存在谷歌未知的、正在流通中的mail.google.com证书时,他们能够发现这一点。
以下是我理解的步骤:
- 每次任何CA签署证书时,都应该将其放入全局公共“证书日志”(certificate log)中
- Google机器人也会将它在互联网上找到的每一个证书放入证书日志中
- 如果证书不在日志中,那么我的浏览器将不会接受它(或者将来会停止接受它)
- 任何人都可以在任何时候查看日志,以发现其中是否存在流氓证书
因此,如果一家荷兰的CA签署了一个邪恶的mail.google.com证书,他们要么把它放在公共日志中(谷歌会发现他们),要么把它从公共日志中删除(浏览器会拒绝它)。