美文网首页
https学习

https学习

作者: 知而乐者 | 来源:发表于2021-03-05 20:24 被阅读0次

    https产生原因

    由于http是明文传递数据,如果在客户端和服务器端设置个代理服务,完全可以拿到通信数据,https可以保证,通信是和真正的服务器通信(可能也是代理,但是没有意义,代理服务器无法拿到通信数据),https主要要保证怎么样传输数据是最安全的,及即使中间有个侵入的代理服务,代理服务也拿不到数据信息
    需要解决两个问题:

    • 如何保证与我通信的机器是真正的服务器?
      通过握手来保证是真正的服务器

    • 即使代理转发服务器的消息,如何保证消息内容代理服务器是无法解析呢?
      在握手过程中商量好加密算法来保证无法解析

    https通信过程

    1、客户端请求服务端,携带随机参数,以及包含客户端支持的SSL指定版本,加密组件列表(所使用的加密算法 密钥长度等)

    Handshake Protocol: Client Hello
    Version: TLS 1.2 (0x0303)
    Random: 1cbf803321fd2623408dfe…
    Cipher Suites (17 suites)
    Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
    Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)
    

    2、服务端选择算法,将证书返回(证书中包含公钥),以及选择的加密算法,以及一个随机数,以及一个用私钥加密的签名

    • 随机选择加密算法返回,以及服务端的一个随机数
    Handshake Protocol: Server Hello
    Version: TLS 1.2 (0x0303)
    Random: 0e6320f21bae50842e96…
    Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)
    
    • 返回证书信息以及私钥加密信息,以及算法的参数
    Handshake Protocol: Server Key Exchange
    EC Diffie-Hellman Server Params
    Curve Type: named_curve (0x03)
    Named Curve: x25519 (0x001d)
    Pubkey: 3b39deaf00217894e...
    Signature Algorithm: rsa_pkcs1_sha512 (0x0601)
    Signature: 37141adac38ea4...
    

    至此客户端和服务器通过明文共享了三个信息:Client Random、Server Random 和 Server Params。

    3、客户端进行证书的验证,同时将证书里的公钥解析,将字符串解密,判断公钥是否合法

    • 走证书链逐级验证,确认证书的真实性,再用证书公钥验证签名,就确认了服务器的身份
      4、客户端拿到了密钥交换算法的两个参数(Client Params、Server Params),就用 ECDHE 算法一阵算,算出了一个新的东西,叫“Pre-Master”,其实也是一个随机数,通过公钥加密将随机数发送到服务端,现在一共有三个随机数了

    5、客户端和服务器手里有了三个随机数:Client Random、Server Random 和 Pre-Master。用这三个作为原始材料,就可以生成用于加密会 话的主密钥,叫“Master Secret”

    6、握手就快结束了。客户端发一个“Change Cipher Spec”,然后再发一个“Finished”消息,把之前所有发送的数据做个摘要,再加密一下,让服务器做个验证

    7、服务器也是同样的操作,发“Change Cipher Spec”和“Finished”消息,双方都验证加密解密 OK,握手正式结束,后面就收发被加密的 HTTP 请求和响应了


    image.png

    问题

    为什么不直接用公钥和私钥加密传输数据?
    非对称加密性能太差
    第三方机构是怎么颁发证书的?

    • 这个“第三方”就是我们常说的 CA(Certificate Authority,证书认证机构)。它就像网络世界里的公安局、教育部、公证中心,具有极高的可信度,由它来给各个公钥签名,用自身的信誉来保证公钥无法伪造,是可信的。CA 对公钥的签名认证也是有格式的,不是简单地把公钥绑定在持有者身份上就完事了,还要包含序列号、用途、颁发者、有效时间等等,把这些打成一个包再签名,完整地证明公钥关联的各种信息,形成“数字证书”(Certificate)
      浏览器被调包是不是也不安全?
      是的。比如解密后直接将信息传到另一台服务器

    客户端如何验证证书的合法性?

    • 首先浏览器读取证书中的证书所有者、有效期等信息进行校验,校验证书的网站域名是否与证书颁发的域名一致,校验证书是否在有效期内
    • 浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发
      如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的。
      如果找到,那么浏览器就会从操作系统中取出颁发者CA 的公钥(多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥),然后对服务器发来的证书里面的签名进行解密
    • 浏览器使用相同的hash算法计算出服务器发来的证书的hash值,将这个计算的hash值与证书中签名做对比,对比结果一致,则证明服务器发来的证书合法,没有被冒充
      (证书是CA颁发的,证书里面会有签名,签名是用CA的私钥加密的,加密的明文是证书通过hash算法算出来的Hash值)

    公钥、私钥、数字证书的关系是什么?

    • 公钥是公开的,不需要保密,而私钥是由证书持有人自己特有,并且必须妥善保管和注意保密。
    • 数字证书则是由证书认证机构(CA)对证书申请者真实身份验证之后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机构的公章)后形成的一个数字文件

    相关文章

      网友评论

          本文标题:https学习

          本文链接:https://www.haomeiwen.com/subject/yyyrqltx.html