HTTPS知识点总结
熬夜把
深入浅出HTTPS:从原理到实战
这本书看完了,总结一些主要的知识点,另外劝告各位熬夜伤身体
TLS/SSL协议综述
什么是TLS/SSL协议
在早期,为了解决HTTP的安全问题,网景公司在1994年创建了SSL协议。一开始SSL协议只是浏览器的一个拓展,后来逐渐发展成一个独立协议,用于保证网络通信的认证和安全,SSL协议有SSLv1、SSLv2、SSLv3。
1996年,IETF(Internet Engineering Task Force)组织在SSLv3的基础上进一步标准化了该协议,微软为这个新协议取名TLS v1.0,目前最新的版本是TLSv1.3
TLS/SSL协议的目标
TLS/SSL协议在网络模型中位于应用层
和传输层
之间,构建在TCP上,构建在UDP上的称为DTLS
。
TLS/SSL协议有4个目标:
加密安全
通信双方的数据是安全的,不可篡改和伪造。
互操作性
TLS/SSL协议是标准的,任何开发者基于TLS/SSL RFC设计规范都可以实现该协议,开发者也很容易在应用中引入TLS/SSL协议。
可扩展性
密码学算法在不停迭代,随着时间推移会出现更安全的算法,为了保证安全TLS/SSL协议允许动态引入新的算法。在不同的通信环境中TLS/SSL协议允许通信算法协商出一个双方都支持的加密算法,这保证TLS/SSL协议能够工作在各种环境下。
效率
由于TLS/SSL协议涉及了很多密码学算法的运算,因此增加了通信延时和机器负载,但随着TLS/SSL协议的发展,一些新的技术和解决方案正在逐步提升TSL/SSL协议的通信效率
OpenSSL和TLS/SSL的关系
TSL/SSL协议的实现有很多种,比如OpenSSL、LibreSSL、BoringSSL,目前最通用的实现是OpenSSL。
OpenSSL是一个底层密码库,封装了所有的密码学算法、证书管理、TLS/SSL协议实现,集成在大部分操作系统中,可以在代码中调用。而如果只是管理TLS/SSL证书则只需要使用OpenSSL命令行工具。
HTTPS和TLS/SSL的关系
TLS/SSL协议位于传输层和应用层之间,HTTP是应用层协议的一种,HTTP+TSL/SSL=HTTPS,应用只需要按照HTTP规范处理HTTP数据即可,对于开发者而言TLS/SSL带来的影响是透明的。
为了与HTTP区分开,HTTP默认使用80端口,而HTTPS默认使用443端口
TLS/SSL协议中的算法
TLS/SSL协议核心三大步骤:认证、密钥协商、数据加密
认证
认证通过
PKI技术
解决,PKI技术的核心是证书,证书通过密码学算法中的数字签名技术
实现。证书中包含服务器的身份信息和公钥,在进行
密钥协商
之前要先证书的认证,即保证通过证书获取到的公钥是服务器的公钥而不是攻击者的公钥。密钥协商
通过
RSA算法
或者DH算法
,客户端和服务器端会协商出一个预备主密钥
,随后预备主密钥通过密钥衍生算法
被转换成用于保证机密性和完整性需要的主密钥
。RSA算法和DH算法都属于
公开密钥算法
,习惯上称为非对称加密算法
。数据加密
为了保证数据的机密性、完整性和防篡改,需要使用加密算法和MAC算法,前者提供机密性,后者提供完整性和防篡改。
加密算法分为
对称加密算法
和非对称加密算法
。相对来说,公开密钥算法尤其是RSA算法运算非常缓慢,因此在数据加密部分使用的是对称加密算法,使用会话密钥
(即预备主密钥转换出的主密钥)作为加密密钥。
常用密码学算法
加密基元
加密基元是一些功能单一、可靠的基础算法,通过加密基元构建出各种复杂的算法学算法供人类使用。
密码学伪随机数生成算法
和密码学Hash算法
都是密码学中的基础算法,很多其他的密码学算法选择这两个算法作为加密基元。密码学伪随机数生成算法:
- 密码学Hash算法:
对称加密算法
- 对称加密算法就是通过一个算法和一个密钥对明文进行加密获得无意义的密文。
对称加密算法有两种类型,分别是
块密码算法
和流密码算法
,推荐使用块密码算法。- 块密码算法:
- 块加密中的迭代模式:
- 流密码算法:
填充标准
对于块密码算法来说,明文长度必须是分组长度的倍数,如果不是倍数,必须有一种填充的机制,填充某些数据保证明文长度是分组长度的倍数,常见标准是
PKCS#7
和PKCS#5
子标准中的填充标准。
消息验证码
消息验证码用于提供数据的完整性,模型为:
MAC值=mac(消息,密钥)
。MAC算法有2种形式,分别是CBC-MAC算法和HMAC算法。其中CBC-MAC算法从块密码算法的CBC分组模式演变而来,HMAC算法使用Hash算法作为加密基元,HMAC结合Hash算法有多种变种,比如HMAC-SHA-1、HMAC-SHA256、HMAC-SHA512。
对称加密算法和MAC算法一起使用以提供机密性和完整性和模式称为Authenticated Encryption(AE)加密模式,主要有三种:
- Encrypt-and-MAC (E&M)
- MAC-then-Encrypt (MtE)
- Encrypt-then-MAC (EtM)
AEAD加密模式是AE模式的一种变体,减轻了使用者的负担,主要有
CCM模式
、GCM模式
、ChaCha20-Poly1305
。加密算法不能提供完整性
加密算法能够解决机密性的问题,但是不能保证数据是完整的。
攻击者截获加密数据之后,虽然没有密钥无法解密数据,但是依然可以修改数据,然后将修改后的数据发送给接收端。接收端收到数据之后如果成功解密,此时获取到的数据已经不是原来的数据,因此加密算法能够保证数据不泄露但是不能保证数据不被篡改。
公开密钥算法/非对称加密算法
非对称加密算法分为功能很多,能够进行加密解密、密钥协商、数字签名。
与对称加密算法不同,非对称加密算法的密钥是一对,分为公钥和私钥。公钥和私钥功能上是一样的,一个密钥加密能够使用另一个密钥解密,但是生成密钥的侧重点不同。
PKCS标准
公开密钥算法的标准称为PKCS(Public KeyCryptography Standards),这个标准由很多的子标准组成,指导使用者正确地使用公开密钥算法。PKCS标准最早是由RSA公司制定的,目前逐步交由标准化组织IETF(Internet Engineering TaskForce)的PKIX工作组来维护。前文中已经提到过
PKCS#7
和PKCS#5
子标准中的填充标准。
密钥协商算法
协商算法分为RSA算法和DH算法,大概的流程如下:
RSA
- 客户端向服务器端发起连接请求,服务器端发送RSA密钥对的公钥给客户端。
- 客户端通过随机数生成器生成一个预备主密钥,用服务器的公钥加密并发送给服务器端。
- 服务器解密预备主密钥,假如能够正确解密,则说明客户端和服务器端共同协商出一个预备主密钥。
DH算法
客户端向服务器端发起连接请求。
服务器端生成一个RSA密钥对,并将公钥发送给客户端。
服务器端生成DH参数和服务器DH密钥对,用RSA私钥签名DH参数和服务器DH公钥,最后将签名值、DH参数、服务器DH公钥发送给客户端。
客户端通过服务器RSA的公钥验证签名,获取到DH参数和服务器DH公钥。
客户端通过DH参数生成客户端的DH密钥对,并将客户端DH公钥发送给服务器端。
客户端通过客户端DH私钥和服务器端DH公钥计算出预备主密钥。
服务器端接收到客户端的DH公钥,结合服务器的DH私钥计算出预备主密钥。
最终客户端和服务器端计算出的预备主密钥能够保持一致。
图中的Z就是生成的预备主密钥
DH算法分为2种类型,
静态DH算法(DH算法)
和临时DH算法(EDH算法)
。- 静态DH算法中p和g两个参数永远是固定的,而且服务器的公钥(Ys)也是固定的,虽然节省了CPU资源的消耗,但是一旦服务器对应的DH私钥泄露,就不能保证安全性。
- 临时DH算法每次初始化连接时DH密钥对会重新生成,即使密钥泄露也只影响此次通信。
椭圆曲线密码学(ECC)
ECC是新一代的公开密钥算法,主要的优点就是安全性,极短的密钥能够提供很大的安全性。
比如224比特的ECC密钥和2048比特的RSA密钥可以达到同样的安全水平,由于ECC密钥具有很短的长度,运算速度非常快。
ECC可以结合其他公开密钥算法一起使用,比如
ECC + DH密钥协商算法 = ECDH密钥协商算法
、ECC + 数字签名DSA算法 = ECDSA数字签名算法
。ECC模型中一个关键点称为
命名曲线
,命名曲线与性能和安全性直接相关,大部分开发者可以直接使用常见的命名曲线命名曲线设计标准:
常见命名曲线:
数字签名
消息验证码中的MAC算法只能保证消息不被篡改,但是却无法知道消息的发送者是谁,即无法防抵赖。对于公开密钥加密算法而言,私钥加密过的数据只有公钥才能够解密,即私钥的拥有者不能否认数据是其发出的。
RSA属于非对称加密算法,虽然能够用于实现数字签名。
数字签名技术有一个标准
DSS
,其标准算法就是DSA签名算法
,只能进行签名,不能进行加密解密。DSA算法能结合ECC,称为ECDSA数字签名算法,ECDSA的安全和性能更有保障。
数字签名的流程
签名生成流程:
签名验证流程:
HTTPS完整流程
握手层和加密层
对于一个HTTPS回话,会先进行TCP的3次握手建立TCP连接,随后交由握手层协商安全通信需要的信息,最后将信息传递给加密层。
使用RSA密码套件
DHE_RSA密码套件
可以看到协商密码套件的流程是固定的
密码套件
- 密码套件的结构并没有统一的标准,密码套件决定了用于密钥协商的算法。
为了防止在密钥协商过程中消息被篡改,加密层开始加密HTTP数据之前要先验证协商过程中的数据没有被篡改。
客户端将发送和接收到的所有握手消息组合在一起,然后计算出摘要数据,握手层使用密钥块对摘要数据进行加密和完整性保护,然后发送给服务器。
服务器接收到验证消息后,使用加密块解密出摘要数据。
紧接着服务器自行计算发送和接收的所有握手消息,再计算出消息的摘要数据,如果摘要数据和解密出的摘要数据相同,代表客户端发送的消息没有被篡改。
证书
PKI(Public Key Infrastructure,称为公钥基础设施)是一个集合体,由一系列的软件、硬件、组织、个体、法律、流程组成,主要目的就是向客户端提供服务器身份认证,认证的基础就是必须找到一个可信的第三方组织,认证的技术方案就是数字签名技术。第三方组织能够使用数字签名技术管理证书,包括创建证书、存储证书、更新证书、撤销证书。
引用自《深入浅出 HTTPS:从原理到实战》
PKI技术有很多标准,HTTPS中最常用的标准是X.509标准和ASN.1标准。
- X.509目前有3个版本,现在最常用的是X.509 V3版本。
- ASN.1类似于JSON或者XML这样的数据结构,用来描述证书结构。
- X.509标准定义了证书应该包含的内容,而为了让机器和人更好地理解和组织X.509标准,可以采用ASN.1标准来描述X.509标准(或者说证书),ASN.1类似于伪代码,是一种可理解的数据结构。
X.509标准的内容
- 证书的作用,第三方认证机构为服务器实体(end entity)签发证书,证书校验方可以使用证书对服务器实体的身份进行认证。
- 证书文件的结构,证书是一个文件,理解证书的结构、属性、值非常重要。
- 管理证书,服务器实体(end entity)向CA机构申请证书的流程,CA机构审核服务器实体身份的标准,签发证书的流程。
- 校验证书,通过严谨的步骤校验证书,或者说校验服务器实体(end entity)身份,涉及两部分内容,一部分是证书签名校验,涉及证书链的概念。另外一部分是校验服务器实体属性,比如证书包含的域名、证书有效期等。
- 证书的撤销问题,包括CRL和OCSP协议等概念。
PKI的组成
服务器实体,即需要证书的实体,域名的拥有者,服务器需要创建一个
CSR
文件用于表明身份CA机构,即证书签发机构,验证服务器实体身份之后签发证书
RA机构,注册机构,主要审核服务器实体的有效信息,通常CA机构中包含了RA机构
证书仓库,CA机构签发的证书都保存在证书仓库中,证书可能被吊销或者过期,CA机构吊销的证书可以通过CRL和OCSP服务查询到
证书校验方,即校验证书真实性的软件。为了校验证书,证书校验方必须充分信任第三方CA机构,集成各个CA机构的根证书。最常见的证书校验方是浏览器
证书主要结构
version
证书的版本号,目前有3个版本(v1, v2, v3)
serialNumber
证书编号,对于不同的CA机构,证书编号是无法预测的
signature
证书的签名值,用于验证证书是否被修改。为了让证书校验方能够校验签名,证书中还会包含计算签名使用的
签名算法
和摘要算法
issuer
签发证书的CA机构
validity
证书的有效期,CA机构是赢利的组织,证书使用期限越长价格越高
subject
服务器实体的名称,即证书申请者的名称。这个属性中包含很多信息,早期证书校验方校验证书的时候是将URL中的域名和证书subject值中的CN(Common Name)比较,如果一致,代表证书校验成功。现在由于一张证书可能包含多个域名,所以不再使用CN来校验证书域名了,而使用SAN证书扩展进行域名校验。
subjectPublicKeyInfo
subjectPublicKeyInfo包含两部分信息,分别是公开密钥算法和公钥值
issuerUniqueID和subjectUniqueID
分别代表CA机构和服务器实体的唯一编号,目前已经被相应的证书扩展替代。
extension
扩展是X.509 V3版本引入的,主要是为了扩展证书的含义,在不改变X.509版本的情况下,可以相对方便地增加证书新属性,新添加的扩展是否生效取决于证书校验方。
extension字段中可以包含多个扩展,每个扩展都有一个critical属性,如果该属性值等于真(TRUE),证书校验方必须严格处理。
证书主要扩展
使用者可选名称(Subject Directory Attributes, SAN扩展)
在早期的X.509证书中,每个证书包含一个域名,现在可以通过这个拓展在一个证书中包含多个域名。
CA密钥标识符(Authority Key Identifier)
CA密钥标识符表明了哪个CA机构签发了证书。
使用者密钥标识符(Subject Key Identifier)
某个中间证书签署了一个服务器实体证书,中间证书中的使用者密钥标识符就是服务器实体证书的CA密钥标识符。
基础约束(basic constraints)
该扩展表示证书是否能够签发证书。
密钥用法(Key Usage)
定义了证书的用途,证书的用途有身份验证、数字签名、签发证书等,如果基础约束扩展被设置为True,那么该扩展也必须设置。
密钥扩展用法(Extended Key Usage)
表示证书的具体用途,一般是为了约束服务器实体证书,
CRL分发点
证书校验方用于在校验服务器实体证书时校验该证书是否已被吊销
CA机构信息(Authority Information Access)
这个扩展包含了CA机构的一些其他信息,主要的
OCSP服务地址
和CA Issuers
OCSP服务地址也是用于校验证书是否已被吊销。
与CRL不同,CRL是一个吊销证书列表,校验方需要将整个列表下载下来,然后检查待校验证书是否在这个列表中,这要求校验方经常性更新CRL文件。
而OCSP服务地址能够根据待校验证书的信息直接返回证书的吊销情况,不需要本地维护吊销列表。
CA Issuers保存了中间证书地址,当服务器没有发送完整的证书链是校验方能够从这个地址下载中间证。这保证了当没有获取到完整证书链时校验方能够通过迭代下载自行补全整个证书链。
CSR
服务器实体在申请证书之前需要先生成一个CSR文件交给CA机构
CSR文件包括两部分内容:
生成证书的必要信息,比如域名信息、公钥。
此处的公钥即进行
密钥协商
时使用的公钥,在进行密钥协商时需要获取到服务器的公钥,SSL/TLS中将公钥存储在证书中,这样既能提供公钥,又能证明公钥的身份,防止了中间人攻击。服务器实体的证明材料,比如域名拥有者所在地区、拥有者名称等。
CSR文件的生成过程
- 服务器实体创建一对非对称加密密钥对。
- 服务器生成
CertificationRequestInfo
结构体,其中包含域名和刚刚创建密钥对中的公钥。 - 使用密钥对中的私钥对
CertificationRequestInfo
结构体进行签名获得签名值。 - 组合
CertificationRequestInfo
结构体和签名值获得CSR
文件,将其发送给CA机构。
证书链
从证书链的角度看,证书分为以下三种:
- 根证书,又称为自签名证书,处于证书链的最顶端,是CA机构用于签发证书的证书。
- 服务器实体证书,处于证书链的最低端,其中包括了服务器实体的信息,服务器实体公钥和域名。
- 中间证书 ,处于服务器实体证书和根证书之间,能够用于签发证书,在一条证书链的中间证书可以有多个。
每中证书中都包含由CA签发者通过私钥提供的此证书的签名。
证书校验方通过签名者证书中的公钥校验当前证书,若证书没有被修改且证书有效则继续向上迭代校验。
根证书是证书链的最顶端,它的签名值是自己签名的,证书校验方完全相信根证书。
如果整个证书链校验过程没有出现问题则这个服务器实体证书合法,否则证书不合法。
委派和交叉认证
委派认证
很多企业和个人都会申请证书,如果全部交由根CA机构签发会有很大的压力,并且不同地区语言和政策有所不同,所以根CA机构通常会委派一个中间CA机构,为其签发一张中间CA证书来代替根CA机构签发证书。
证书校验方只包含根CA机构的根证书,而根证书的升级是非常麻烦的,而中间证书升级却很简单,只需要为其重新签发一张新的CA证书即可。
交叉认证
当一个新的根CA机构要投入使用,新的根CA证书不可能立刻被嵌入到证书校验方的可信任证书列表,解决的方案就是让另外一个根CA机构为其签发一张二级CA证书,由这个二级CA证书签发服务器实体证书,此时这个新CA机构能够立即投入使用。
证书吊销
证书吊销有两种状态,分别是:
- 永久吊销,表示某张证书永久性地被吊销。
- 临时吊销,由于某些原因,某张证书只是临时被吊销。
证书校验方通过CRL
(Certificate Revocation List,证书吊销列表)和OCSP
(Online Certificate Status Protocol,在线证书状态协议)来检查证书吊销状态
OCSP和CRL的区别:
使用CRL校验证书吊销状态的时候,需要下载完整的CRLs文件,然后再进行吊销状态检查。
使用OCSP获取证书状态则简单得多,OCSP请求方为了查询某张证书的吊销状态,向OCSP提供方发送一个查询请求,OCSP提供方根据查询条件,直接返回该证书的吊销状态。
标准OCSP存在的问题已经由OCSP封套技术解决,OCSP封套技术提升了OCSP的服务质量。
证书透明度
证书透明度(Certificate Transparency, CT),通过证书透明度机制,CA机构、服务器实体、客户端能够监控、审计证书的签发、使用,确保证书是被正确使用的。
证书分类
按照验证模式分类
证书可以分为三种类型,分别是DV证书、OV证书、EV证书,审核难度逐渐增加
其中DV适合于个人网站,OV证书适合企业和政府机构。
EV证书申请难度是最高的,对于DV、OV证书,浏览器地址栏上会出现一个绿色小锁图标,而对于EV证书,浏览器地址栏上除了绿色小锁图标,还会出现服务器实体的名称。
根据域名进行分类
单域名证书
即简单的一张证书包含一个域名,比如
www.example.com
泛域名(Wildcard Domain)证书
一张证书可以包含注册域的所有子域名,比如
*.example.com
,这个证书能够用于www1.example.com
、www2.example.com
等。SAN(Subject Alternative Names)证书
使用SAN扩展的证书,能够在一张证书中包含多个域名,也被称为多域名证书,相当于将多个单域名证书合并为一个SAN证书。
SAN范域名证书
相当于将多个泛域名证书合并。