HTTPS
简介
HTTPS(Hypertext Transfer Protocol Secure,常称为HTTP over TLS,HTTP over SSL或HTTP Secure),超文本传输安全协议。 经由HTTP进行通信,但利用SSL/TLS来加密数据包。
SSL/TLS 协议,它位于 HTTP 协议与 TCP/IP 协议中间。
加密
对称加密
"对称加密算法"(Symmetric-key algorithm)
- 一个密钥
- 服务器和客户端都使用此密钥
非对称加密
1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法。
- 一个公钥,一个私钥
- 不对外公布的密钥称为私钥,一般在服务器
- 所有人都可以获取的称为公钥,一般在客户端
- 公钥加密的内容只有私钥可以解密,私钥加密的内容只有公钥可以解密。
非对称 + 对称
使用对称密钥的好处是速度比较快,使用非对称密钥的好处是可以使得传输的内容不能被破解。
必须去专门的证书机构注册一个证书,证书中存储了用权威机构私钥加密的公钥。这样客户端用权威机构的公钥解密就可以了,权威机构的公钥存在电脑里。

现在 HTTPS 协议的握手阶段变成了四步:
- 客户端: 你好,我要发起一个 HTTPS 请求,请给我公钥
- 服务器: 好的,这是我的证书,里面有加密后的公钥
- 客户端: 解密成功以后告诉服务器: 这是我的 (用公钥加密后的) 对称秘钥。
- 服务器: 好的,私钥解密后拿到对称秘钥,后续就用它传输。
申请证书
- 什么是CSR? - 腾讯云文档
CSR 即证书签名申请(Certificate Signing Request),获取 SSL 证书,需要先生成 CSR 文件并提交给证书颁发机构(CA)。
CSR 包含了用于签发证书的公钥、用于辨识的名称信息(Distinguished Name)(例如域名)、真实性和完整性保护(例如数字签名),通常从 Web 服务器生成 CSR,同时创建加解密的公钥私钥对。 - key文件 和 crt或pem文件 配置在服务器上
sh
# xxx.csr
-----BEGIN CERTIFICATE REQUEST-----
xxx
-----END CERTIFICATE REQUEST-----
# xxx.key
-----BEGIN RSA PRIVATE KEY-----
xxxx
-----END RSA PRIVATE KEY-----
# xxx.crt 和 xxx.pem 同样的内容,服务器证书和CA中间证书
-----BEGIN CERTIFICATE-----
xxxx
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
xxxx
-----END CERTIFICATE-----
我们来介绍一下数字证书认证机构的业务流程:
- 服务器的运营人员向第三方机构CA提交公钥、组织信息、个人信息(域名)等信息并申请认证;
- CA通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;
- 如信息审核通过,CA会向申请者签发认证文件-证书。
证书包含以下信息:- 申请者公钥、申请者的组织信息和个人信息、签发机构 CA的信息、有效时间、证书序列号等信息的明文
- 同时包含一个签名。
签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA的私钥 对信息摘要进行加密,密文即签名;
- 客户端 Client 向服务器 Server 发出请求时,Server 返回证书文件;
- 客户端 Client 读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA的公钥 解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即服务器的公开密钥是值得信赖的。
- 客户端还会验证证书相关的域名信息、有效时间等信息; 客户端会内置信任CA的证书信息(包含公钥),如果CA不被信任,则找不到对应 CA的证书,证书也会被判定非法。

HTTPS工作流程
- Client发起一个HTTPS的请求,根据RFC2818的规定,Client知道需要连接Server的443(默认)端口。
- Server把事先配置好的公钥证书(public key certificate)返回给客户端。
- Client验证公钥证书:比如是否在有效期内,证书的用途是不是匹配Client请求的站点,是不是在CRL吊销列表里面,它的上一级证书是否有效,这是一个递归的过程,直到验证到根证书(操作系统内置的Root证书或者Client内置的Root证书)。如果验证通过则继续,不通过则显示警告信息。
- Client使用伪随机数生成器生成加密所使用的对称密钥,然后用证书的公钥加密这个对称密钥,发给Server。
- Server使用自己的私钥(private key)解密这个消息,得到对称密钥。至此,Client和Server双方都持有了相同的对称密钥。
- Server使用对称密钥加密“明文内容A”,发送给Client。
- Client使用对称密钥解密响应的密文,得到“明文内容A”。
- Client再次发起HTTPS的请求,使用对称密钥加密请求的“明文内容B”,然后Server使用对称密钥解密密文,得到“明文内容B”。
参考
- 看图学 HTTPS - 掘金
- 深入理解 HTTPS 工作原理 - 掘金
- 刨根问底系列之https详细握手过程 - 掘金
抓包图 - 面试官:你能说说常见的前端加密方法吗? - 掘金