• 002. https通信(CA证书认证 + 密钥商定 )


    服务端与客户端建立https通信的过程:

    一、认证:客户端第一次访问服务端时,要求服务端证明自己可被信任


    1.证书:由服务端申请、第三方CA颁发的,存放在服务端的证书;

        证书包含:服务端的公钥、服务端的基本信息(明文)、CA的信息、签名(对服务端公钥、基本信息摘要进行hash计算得到hash值,然后使用CA的秘钥对该hash值进行加密后的密文)


    2.证书作用:当客户端访问服务端时,服务端发送证书(给客户端检查)证明自己已在第三方CA登记,可被信任。

      参考:https://www.cnblogs.com/handsomeBoys/p/6556336.html

            https://blog.csdn.net/lwwl12/article/details/80691746     CA、根证书与数字证书

         https://www.cnblogs.com/fps2tao/p/10036910.html

         https://segmentfault.com/a/1190000002554673

    注意:

    2.1 客户端如何验证服务端发送的证书,证明服务端可被信任

      客户端需要事先安装第三方CA的根证书(CA中心颁发给CA中心自己的证书),该根证书下的所有证书都将被客户端信任。

       客户端拿到服务端的证书后,读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,

    然后利用对应 CA 的公钥(CA根证书)解密签名,得到服务端公钥及其他信息;解密得到的信息与证书中公开的信息对比(),如果一致,则可以确认证书合法(即服务端被信任 ,服务端的公钥是其真实的公钥)

    2.2 客户端可以要求验证服务端,同样,服务端也可以要求验证客户端 (这种情况较少,如金融服务要求验证客户端)

      原理基本相同,客户端有自己CA证书,访问服务端时,发送自己CA证书给服务端检查。

    2.3 证书可以有第三方颁发,也可以由服务端自己制作(服务端自己颁发给自己的)。

      OpenSSL

    二、密钥商定(TLS握手)

    1.密钥商定:对称加密 + 非对称加密 

      得到通信加密的秘钥。

      参考:https://www.cnblogs.com/xiohao/p/9054355.html

    2.开始使用商定的密钥https加密通信

    附录: https 完整的认证+密钥商定过程

    参考:https://segmentfault.com/a/1190000002554673

    假设A与B通信,A是客户端,B是服务器端

    ----------- 加密后的消息放在方括号[]里,以突出明文消息的区别。双方的处理动作的说明用圆括号()括起。

    A:我想和你安全的通话,我这里的对称加密算法有DES,RC5,密钥交换算法有RSA和DH,摘要算法有MD5和SHA。

    B:我们用DES-RSA-SHA这对组合好了。
    这是我的证书,里面有我的名字和公钥,你拿去验证一下我的身份(把证书发给A)。
    目前没有别的可说的了。

    A:(查看证书上B的名字是否无误,并通过手头早已有的CA的证书验证了B的证书的真实性,如果其中一项有误,发出警告并断开连接,这一步保证了B的公钥的真实性)
    (产生一份秘密消息,这份秘密消息处理后将用作加密密钥,加密初始化向量(IV)和hmac的密钥。将这份秘密消息-协议中称为per_master_secret-用B的公钥加密,封装成称作ClientKeyExchange的消息。由于用了B的公钥,保证了第三方无法窃听)
    我生成了一份秘密消息,并用你的公钥加密了,给你(把ClientKeyExchange发给B)
    注意,下面我就要用加密的办法给你发消息了!
    (将秘密消息进行处理,生成加密密钥,加密初始化向量和hmac的密钥)
    [我说完了]

    B:(用自己的私钥将ClientKeyExchange中的秘密消息解密出来,然后将秘密消息进行处理,生成加密密钥,加密初始化向量和hmac的密钥,这时双方已经安全的协商出一套加密办法了)
    注意,我也要开始用加密的办法给你发消息了!
    [我说完了]

    A: [我的秘密是...]

    B: [其它人不会听到的...]

  • 相关阅读:
    大聊Python----SocketServer
    2、MySQL常见数据库引擎及比较?
    大聊Python----通过Socket实现简单的ssh客户端
    1、列举常见的关系型数据库和非关系型都有那些?
    uva12563 Jin Ge Jin Qu hao(01背包)
    UVA 12174 Shuffle(滑动窗口)
    C++中substr函数的用法
    uva11078
    11462 Age Sort(计数排序)
    UVA 11988 Broken Keyboard (a.k.a. Beiju Text) (链表,模拟)
  • 原文地址:https://www.cnblogs.com/badboyh2o/p/10229116.html
Copyright © 2020-2023  润新知