1

HTTPS 连接是如何建立的

 2 years ago
source link: https://zzyongx.github.io/blogs/how-https-connect-build.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

HTTPS 连接是如何建立的

本文是The First Few Milliseconds of an HTTPS ConnectionSSL 的阅读笔记,主要描述了建立HTTPS连接的过程,侧重关注以下几点:

  1. SSL 连接完成需要几次握手
  2. HTTPS 证书如何发挥作用
  3. 安全是如何保障的

1 SSL建立连接的三次握手

这里的 握手 要和TCP握手区分,因为这时TCP连接已经建立。如果是HTTP连接,在TCP连接建立完成后,就会发GET请求。但是HTTPS连接,需要基于TCP之上建立的SSL连接,SSL连接本质还是应用层的,所谓握手也只是说需要几次TCP交互而已(这里的一次交互不一定就是一个TCP包,可能是多个)。本文分析和Amazon的连接内容来讲解的。

分析几次握手的意义在于,分析除了加密消耗的CPU外,额外的SSL握手对HTTPS响应延迟的影响。

1.1 Client Hello

客户端发起,值得注意的几点是:

  • Random 随机串,包含UNIX时间戳和随时串,稍后使用
  • Session ID,可以是null,如果之前有和Amazon的连接,可以填之前使用的Session ID。
  • Cipher Suites,客户端支持的加密套件
  • Server Name 扩展,2

1.2 Server Hello

服务端响应,值得注意的几点是:

  • Random 随机串,包含UNIX时间戳和随机串,稍后使用
  • Session ID,非null
  • Cipher Suites,服务端从客户端发送的Cipher Suites中选择一个支持的,返回
  • HTTPS 证书

1.3 Client Key Exchange 和 Change Cipher Spec

前者客户端用公钥加密 PreMasterKey 给服务器,后者客户端发送消息结束SSL握手。

这里 PreMasterKey 是随机串,用来生成对称加密的密钥,最终的密钥是通过前两次握手的Random随机串和 PreMasterKey 通过某个算法生成的。

2 Server Name 扩展

HTTP 通过 Host 字段指定服务端的vhost,这样在同一个机器上可以服务多个域名。在HTTPS中,SSL建立阶段,HTTP请求还没有开始,此时服务端并不知道 Host ,所以服务端并不知道返回哪个 Host 对应的证书,所以通常的策略是,不同的 Host 绑定到不同的IP,通过IP来区分不同的域名,这需要在服务端的配置文件里面写Host对应的IP,很难维护。

通过 Server Name 扩展,服务端匹配相应的Host,从而选择相应的HTTPS证书。

3 Cipher Suites 的选择

不同的加密算法,保密程度不同,响应的CPU消耗也不同,服务端可以根据业务需要选择适当的算法。

4 HTTPS 证书的组成

  • 证书的有效期,起止时间
  • RSA 公钥
  • CA和CA签名
  • 证书对应的域名

4.1 RSA 和 HTTPS

RSA 是非对称加密,分公钥和私钥,私钥保密,公钥不保密。公钥加密,私钥解密。私钥签名,公钥验证签名。非对称加密的效率非常低。 对称加密(Cipher Suites中对应的算法),只有一个密钥,加解密都用它,效率比非对称加密高。但是如何 安全传递密钥 是个问题。

HTTPS 是两者的结合,通过RSA传递对称加密的密钥,然后用HTTP请求的数据用对称加密加密。

4.2 中间人攻击

在传送HTTPS证书时,还是普通的TCP请求,数据都没有加密,如果有人截获TCP通信的数据,用攻击者的证书代替真实的证书,怎么办?CA是证书签发者,HTTPS证书需要通过CA购买,从CA购买的证书有CA的签名。

上面说过RSA可以用私钥做数据签名,然后公钥持有者可以检验数据来自私钥持有者,而不是伪造的。这里浏览器内置了CA的公钥,浏览器用CA的公钥验证HTTPS证书的签名,确认证书的确是CA签发的。证书中还包含了域名信息,通过CA签名和域名确认证书不是伪造的。

会不会有人冒充域名持有者获取了CA签名呢?如果CA不靠谱,是有可能的。我想这也是为啥有的CA卖的HTTPS证书贵,有的CA卖的HTTPS证书便宜。

4.3 自签发的证书

如果是内部应用,可以自己做HTTPS证书。这时浏览器显示不信任的证书,可以自己做CA公钥,导入浏览器,这样就不会不信任了。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK