实验室:SSL 如何工作?
本指南面向想要了解 SSL 和 TLS 的人士。这些协议用于保护 HTTP 会话内容免受第三方和窃听者的攻击。TLS(或 SSL)与 HTTP 的组合会创建HTTPS连接。但为了理解这一点,您需要了解什么是套接字。
套接字的快速回顾
套接字在计算机科学中广为人知,几乎所有编程语言中套接字的方法都以相同的方式命名。因此,它们通常包含名为、 、 、bind()
和listen()
的connect()
方法。下图展示了它们的调用方式:accept()
send()
recv()
本文中使用的“服务器”一词,仅指调用listen()
套接字的计算机。它不一定是Web 服务器或 HTTP 服务器。
TLS 还可用于保护其他协议,例如 SSH。事实上,由于 TLS 只涉及签名证书,理论上任何协议都可以使用 TLS 加密。
标准与你
SSL 是旧版本,TLS 是新版本。以下时间线展示了从原始 SSL 标准到最新版本 TLS 1.3 的演变过程:
尽管自 2015 年以来 SSL 版本均未得到支持,但“SSL”这一名称通常用于指代 TLS。但在本文中,SSL 将指代 SSL 的原始版本。
对于网站和 HTTPS 来说,当某个协议被弃用时,浏览器将不再使用该弃用的协议。
对于公钥密码学(SSL/TLS 协议和加密背后的数学原理),存在一整套统称为PKCS的标准。这个系列中有以下几个标准:
- PKCS#1——SSL/TLS 中使用的 RSA 公钥和私钥。
- PKCS#3——Diffie-Hellman 密钥交换。
- PKSC#7——描述证书编码的二进制语法。
- PKCS#8 - 描述私钥格式。它们采用 PEM 格式,如下所示:
-----BEGIN PRIVATE KEY-----
MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEAq7BFUpkGp3+LQmlQ
Yx2eqzDV+xeG8kx/sQFV18S5JhzGeIJNA72wSeukEPojtqUyX2J0CciPBh7eqclQ
2zpAswIDAQABAkAgisq4+zRdrzkwH1ITV1vpytnkO/NiHcnePQiOW0VUybPyHoGM
/jf75C5xET7ZQpBe5kx5VHsPZj0CBb3b+wSRAiEA2mPWCBytosIU/ODRfq6EiV04
lt6waE7I2uSPqIC20LcCIQDJQYIHQII+3YaPqyhGgqMexuuuGx+lDKD6/Fu/JwPb
5QIhAKthiYcYKlL9h8bjDsQhZDUACPasjzdsDEdq8inDyLOFAiEAmCr/tZwA3qeA
ZoBzI10DGPIuoKXBd3nk/eBxPkaxlEECIQCNymjsoI7GldtujVnr1qT+3yedLfHK
srDVjIT3LsvTqw==
-----END PRIVATE KEY-----
私钥也可以受密码保护,如下所示:
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIBrzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQImQO8S8BJYNACAggA
MB0GCWCGSAFlAwQBKgQQ398SY1Y6moXTJCO0PSahKgSCAWDeobyqIkAb9XmxjMmi
hABtlIJBsybBymdIrtPjtRBTmz+ga40KFNfKgTrtHO/3qf0wSHpWmKlQotRh6Ufk
0VBh4QjbcNFQLzqJqblW4E3v853PK1G4OpQNpFLDLaPZLIyzxWOom9c9GXNm+ddG
LbdeQRsPoolIdL61lYB505K/SXJCpemb1RCHO/dzsp/kRyLMQNsWiaJABkSyskcr
eDJBZWOGQ/WJKl1CMHC8XgjqvmpXXas47G5sMSgFs+NUqVSkMSrsWMa+XkH/oT/x
P8ze1v0RDu0AIqaxdZhZ389h09BKFvCAFnLKK0tadIRkZHtNahVWnFUks5EP3C1k
2cQQtWBkaZnRrEkB3H0/ty++WB0owHe7Pd9GKSnTMIo8gmQzT2dfZP3+flUFHTBs
RZ9L8UWp2zt5hNDtc82hyNs70SETaSsaiygYNbBGlVAWVR9Mp8SMNYr1kdeGRgc3
7r5E
-----END ENCRYPTED PRIVATE KEY-----
(这就是为什么 AWS 和其他云计算服务会在带有扩展名的文件中为您提供私钥的原因.pem
。)
PEM 文件后面-----BEGIN
跟着一个标签,然后是-----
。然后,它有一个基于标签的 base64 编码消息,后面跟着-----END
、标签和-----
。标签可以是公钥、私钥、证书或其他加密对象。
-
PKCS#10 定义您发送给 CA 以请求证书的消息。
-
PKCS#12 - 描述如何将私钥、证书和其他安全资源打包到一个名为SafeBag的文件中。SafeBags 的扩展名为
.p12
或.pfx
。
证书
证书是电子文档,用于证明您拥有证书中的公钥,从而提高 SSL/TLS 的安全性。SSL/TLS 中也使用公钥和私钥。证书以证书链的形式传输。父证书在子证书之后传输,然后可能会传输一些更高级别的证书,直到传输到根证书为止。
根证书是位于证书链末端(顶部)的证书。它们是绝对可信的。一些浏览器已包含 HTTPS 根证书。
证书会关联一个密钥对。密钥对由一个公钥和一个私钥组成。密钥对可以证明您确实是您所声称的那个人。这比使用密码更好,因为如今,暴力破解十几个字符长的密码非常容易。密钥是固定长度的长乱码字节。
证书链中的每个证书都采用 X.509 文件格式。X.509 证书的内容如下:
首先是证书本身:
- 版本号
- 序列号
- 签名算法ID
- 发行人名称
- 有效期
- 不早于
- 不晚于
- 主题名称
- 主题公钥信息
- 公钥算法
- 主体公钥
- 扩展
- 证书密钥用途
- 证书策略
- 证书基本约束
- 等等(更多扩展在这里)
然后按照证书签名算法进行签名。
如何管理证书
证书颁发机构( CA) 向个人或组织颁发证书。证书颁发即表示已签名。CA 被组织成称为公钥基础设施(PKI) 的逻辑单元。通常,每个公司都会制定自己的 PKI。除非公司有权向第三方颁发证书,否则从公司 PKI 颁发的证书通常仅供公司内部使用。
如果CA发现其私钥被盗(例如客户告知),CA将撤销证书。X.509格式有一个特殊的黑名单,称为证书撤销列表(CRL),其中包含已撤销证书的列表。
通常,证书还包含证书策略(CP)。CP 是一份文档,用于描述 PKI 在颁发或管理证书时所遵循的约定。这份文档 (Digicert) 就是现实生活中 CP 的具体内容。
握手
当两台计算机建立连接时(通常是在请求另一台计算机正在连接的accept()
套接字之后),它们会运行一个称为“握手”的标准过程。整个过程大约需要几百毫秒。⚑listen()
-
首先,客户端发送一条ClientHello消息。该消息包含要使用的 TLS 版本、支持的密码套件列表(TLS 专用的加密算法),以及一串称为客户端随机数 (client random) 的随机字节。
-
然后,服务器发送一条ServerHello消息。该消息包含服务器的 TLS 证书、服务器想要使用的客户端密码套件列表,以及另一个名为“服务器随机数”的随机字节串。
-
客户端检查证书是否可信。对于 Web 浏览器,它们会列出可信任的根证书公钥。(请参阅下文关于自签名证书的说明。)⚑⚑
-
客户端从证书中获取服务器的公钥。它会创建一个预主密钥 (Premaster Key),然后使用服务器的公钥对其进行加密,该公钥只能使用服务器的私钥解密。服务器获取到该密钥后,会解密加密的预主密钥。现在两台计算机都拥有了预主密钥。
-
客户端和服务器都使用客户端随机密钥、服务器随机密钥和预主密钥生成相同的会话密钥。如果它们生成的会话密钥不同,则意味着 TLS 会话已被黑客拦截。在同一 TLS 会话中,生成的会话密钥必须相同。
会话密钥用于加密和解密通过
send()
和传输的数据recv()
。会话密钥只能在套接字连接(在 HTTP 中为 HTTP 会话)的生命周期内使用。连接关闭后,会话密钥将失效,无法再使用。 -
客户端发送一条用会话密钥加密的完成消息。然后,服务器也发送一条用会话密钥加密的完成消息。
如果任何步骤失败(包括下面的验证算法),则 SSL/TLS 连接不安全。Web 浏览器通常会终止连接。
此时,发送或接收的数据将通过哈希算法与会话密钥组合生成消息认证码(MAC)。其目的是确保传输数据的完整性。如果服务器和客户端将会话密钥与其数据组合时,生成的 MAC 不匹配,则意味着攻击者篡改了数据。
⚑如果您感到好奇 - 这个过程在底层使用了 Diffie-Hellman 和 RSA 密钥交换算法。
⚑⚑这是证书验证算法:
- 首先检查公钥算法。
- 当前日期和时间将根据证书的有效期进行测试。
- 使用来自浏览器或其他地方的证书吊销列表检查吊销状态。
- 检查证书上的颁发者名称,以确保其与更高级别证书上的主题名称(如果有)匹配。
- 检查主题名称是否位于所有更高证书的允许子树列表中,并且不在任何排除子树列表中。
- 检查证书的所有策略是否在更高证书的允许策略中。
- 确保此证书的策略得到正确使用,换句话说,仅使用具有 SSL 策略的证书建立 SSL 连接。
- 检查证书的路径长度,以确保其不超过本证书或更高证书中指定的最大路径长度。
- 检查密钥使用扩展以确保其被允许签署证书。
- 如果存在扩展,则对其进行验证。
- 所有这些步骤都会重复执行,直到证书链中的下一个最高级别证书,直至根证书。根证书无需验证,即可自动获得信任。
在浏览器中查看 HTTPS 证书
在 Chrome、Firefox 或其他浏览器中,只需点击 URL 上的挂锁图标,然后点击“更多信息”或“证书”。然后,您将看到如下所示的对话框:
这是证书属性的图形浏览器。如果您前往“详细信息”,则可以看到证书链中每个证书的所有字段:
如何获取证书
以下是您可以获得的一些证书类型:
-
域名验证 (DV) - 证明您控制该域名。这通常意味着 CA 会对您的域名进行 WHOIS 查询。
这是唯一一种可以自动安装到服务器的证书类型。其他类型的证书需要手动身份验证,无法自动安装。
-
组织验证 (OV) - 证明您是拥有该域名的合法组织。需要提交法律文件并由人工审核。个人用户无法使用此项服务。
-
扩展验证 (EV) - 证明您是拥有该域名的真实个人或组织。需要提交法律文件并进行人工审核。此外,还需要您的位置信息,因为 CA 需要确保您实际在场并控制该域名。
通常,要申请证书,您需要填写证书签名请求(CSR),为其创建密钥对,并使用私钥对其进行签名。每个 CA 要求在 CSR 中发送的信息会有所不同,具体取决于您申请的证书。为了了解需要哪些类型的信息,以下是 Digitcert 所需的信息。
您还需要阅读每个 CA 的认证实践声明(CPS),其中详细说明了其颁发和管理证书的具体程序。例如,这是 Digicert 的 CSP。
好消息是,如果您只是想为您的网站获取 TLS 证书,您可以从 Let's Encrypt 或 Cloudflare 获取免费的 DV 证书。
您也可以创建一个证书,然后使用程序自行签名,openssl
但我不建议这样做,因为主流浏览器会提醒您的网站用户您使用了自签名证书,这意味着您的用户会认为您的网站不可信。这并不是因为自签名证书不可信。
与普遍的看法相反,这个 Stack Overflow 答案解释了如何保护自签名证书:
值得注意的是,除了购买证书(如上所述)之外,您还可以免费创建自己的证书;这被称为“自签名证书”。自签名证书和购买证书的区别很简单:购买的证书已经由证书颁发机构签名……
缩写词汇总
由于所有这些首字母缩略词都很难记住,特别是如果你是第一次阅读这篇文章,我整理了一份我在本文中使用的 SSL/TLS 和证书首字母缩略词列表:
首字母缩略词 | 完整单词 |
---|---|
加州 | 证书颁发机构 |
公钥基础设施 | 公钥基础设施 |
证书撤销清单 (CRL) | 证书撤销列表 |
CP | 证书策略 |
苹果 | 消息认证码 |
数字视频 | 域验证 |
OV | 组织验证 |
电动汽车 | 扩展验证 |
企业社会责任 | 证书签名请求 |
云服务供应商 | 认证签署流程 |
我们已经完成了
好了,各位,就到这里吧。如果您发现任何错误,请告诉我,以便我们进行更正。
文章来源:https://dev.to/zenulabidin/lab-how-does-ssl-work-5203