HTTPS Interaction - downgoon/hello-world GitHub Wiki

HTTPS 交互过程

四次握手过程

Client->Server: n1=rand() + 请求公钥
Server-->Client: n2=rand() + 公钥证书
Client->CA: verify request
Note left of CA: 哪些CA可信?浏览器厂商预先设置的。
CA-->Client: verified ok
Client->Client: encrypt n3=rand() with pubkey
Client->Server: n3 cipher
Client->Client: gen session key with (n1,n2,n3)
Server->Server: decrypt n3
Server->Server: gen session key with (n1,n2,n3)
Server-->Client: Finish 4-times Handshake

注意事项

  • HTTPS是运维人员的事: SSL是介于TCP与应用层协议之间的,可看着是“传输层”的东西。也就是说,开发人员把代码开发完了,如果为了安全要走HTTPS,只需要在Nginx上配置(运维人员就可以解决,不需要开发介入)。

  • 通信不是用RSA,而是会话秘钥: SSL背后是RSA非对称加密。它的特点:

  • 单向加密,如果服务器有证书,那么客户端给服务器发送消息是加密的;

  • RSA加密速度慢,相对对称加密而言

  • 鉴于上面2个特点,实际上最终用RSA是:生成对称的秘钥,对称秘钥的分发使用RSA加密(实际上只有一个用来生成对称秘钥的随机数是用RSA加密护送的)。

  • 公钥与证书: 所谓证书也叫“公钥证书”,证书中包含了公钥。通俗说,证书是盖了章(盖的是CA的章)公钥。浏览器请求HTTPS站点时,HTTPS站点服务器下发“公钥证书”给浏览器,浏览器会检查这个“公钥证书”有没有盖章,没有的,直接警告;有盖章的,则继续看哪个CA机构,并看CA机构是否是被信任的,不被信任的直接警告;如果信任的,则去CA验证。

  • 浏览器信任的CA: 浏览器对CA签发的证书的信任是“具备传递性”的。浏览器厂商预先内置了全球几家著名的CA机构,子CA机构的根证书需要用内置CA的签名,这样以后子CA签发的证书也会被信任。

  • 免费的CA机构Let's Encrypt: 浏览器内置的CA机构签发的证书,浏览器才不会报出警告。而浏览器内置的CA机构签发证书是要收费的,而且蛮贵的。但是2016年,有个 Let's Encrypt机构提供免费的CA服务。

  • 配置HTTPS需要的东西: 从上面四次握手的流程看,配置HTTPS需要2两个东西:

  • 服务器RSA的私钥:因为客户端上报n3随机数的时候,是用RSA公钥加密的,需要服务端用RSA私钥来解密。

  • 服务器CA签名的证书:RSA私钥能导出公钥,但是不能说私钥能导出证书。因为证书不仅含有公钥,还含有CA对公钥的签名。实际上,我们需要向CA上传公钥,请求CA盖章,CA盖章会核对服务器的信息(比如域名)。当然,这个核对过程本身在Let's Encrypt里,也是完全自动化的,并非人工。比如核对域名所有权,就是在约定在这个域名里放一个约定好的特殊文件,CA通过HTTP访问它,如果有,说明申请者控制了该域名的写权限。

参考资料