zoukankan      html  css  js  c++  java
  • HTTPS连接建立过程(单向&双向)

    HTTPS连接建立过程(单向&双向)

    什么是https

    SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层(如TCP)与应用层(如HTTP)之间对网络连接进行加密。
    HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL 层

    • https的基础是TLS,tls的基本原理是非对称加密,即加密的密钥和解密的密钥是不用的,称为公钥和私钥,使用公钥加密的内容只能使用私钥解密,反之亦然,使用私钥并不能解密私钥加密的内容
    • https连接建立过程分为两部分 一是身份验证部分(验证通信双方各自的身份),二是密钥协商部分(协商出一个双方都认可的对称密钥)
    • https的重点如下
      1. 客户端及服务器的有效性及真实性,确保没有第三方监听,通过CA机构及非对称加密保证
      2. tls握手及密钥协商过程使用非对称加密,加强身份验证及防监听
      3. 由于非对称加密的性能极差,所以仅在握手阶段使用非对称加密
      4. 后续消息通过协商的密钥进行加密,防篡改和防监听

    TCP连接建立流程

    TCP链接建立流程

    HTTPS单向认证

    什么是HTTPS单向认证

    • https单向认证至客户端连接到某个域名或IP时,客户端需要验证服务器的身份,
      服务器的身份一般通过证书的方式进行验证,服务器的证书一般都会在权威的CA机构进行签名,客户端收到服务器证书后,
      会获取服务器证书对应的ca机构的证书,并用CA证书进行解密

    身份认证过程

    • 一般使用非对称加密算法做身份认证
    • RSA
    • DSA
    • ECDSA

    https证书签名及认证过程

    密钥协商过程

    • 有多种算法
    • RSA 通过非对称加密保证安全性
    • DH类算法 通过 "求解离散对数问题" 保证安全性 只能防监听,不能防篡改,所以一般会结合非对称加密算法(RSA,DSA,ECDSA)等做加密
    • ECDH类算法 通过 "椭圆曲线离散对数问题" 保证安全性 同上
    • DHE DH算法增强 E->ephemeral 指“临时密钥”(洋文是“ephemeral key”)即每个会话都选择新的密钥
    • ECDHE ECDH算法增强 同上
    • PSK 预共享密钥(一般用于内部部署,预置密钥在系统内部)
    • SRP Secure Remote Password,与psk类似,密钥换成了密码,还会有一些类似于加盐,随机数之类的机制

    https密钥协商过程

    连接流程

    • ECDHE-RSA的连接及认证过程

    https连接及协商过程

    https连接抓包过程


    身份认证

    1. Client Hello 发送客户端支持的加密协议 及TLS版本 客户端随机数
      https_client_hello内容

      • sessionId和sessionTicket均可用于https会话恢复,区别在与sessionId对应的协商信息保存在服务器中,sessionTicket对应的协商信息保存在客户端中
      • 客户端extension中携带session ticket信息表示客户端支持session ticket
      • 关于扩展字段 pre_shared_key 和psk_key_exchange_modes,可以参考http://ddrv.cn/a/17072
      • 本例中客户端不传递pre_shared_key指明客户端不使用PSK(预共享密钥模式,一般用在个人网络里面)
    2. Sever Hello 发送服务器选择的加密协议及选择的TLS版本,服务器随机数

      • 本例中使用的是ECDHE-RSA算法
        https_server_hello内容
    3. Certificate 服务器发送自己的证书
      https_server_certificate内容


    密钥协商

    1. Server Key Exchange 服务器发送协商对称密钥过程中的必要参数

      • DH类算法因为没有使用私钥进行计算,所以在末尾会使用私钥对报文本身进行签名,证明自己拥有私钥
        https_server_key_exchange内容
    2. Server Hello Done

      • 指示 Server Hello完成
    3. Client Key Exchange 客户端发送协商密钥过程中的必要参数(使用服务端证书中的公钥加密)

      • 客户端收到服务器发送的必要参数,并使用自己的必要参数,计算出一个对称密钥
      • 客户端必要参数发送给服务端后,服务端也能通过这些参数以及第5部中的参数计算出一样的对称密钥
        https_client_key_exchange
    4. Client change Cipher Spec

      • 更改数据传输密钥通知,表示后续的请求都会使用协商好的对称密钥进行加密
    5. Encrypted Handshake Message

      • 使用对称密钥加密过后的握手消息,用来验证对称密钥是否工作
    6. New Session Ticket

      • 由于之前Client Hello及Server Hello都指明了可以使用Session Ticket,所以服务器下发了一个新的Session Ticket,下次客户端需要恢复回话时,可以省去协商密钥的过程
    7. Server change Cipher Spec

      • 更改数据传输密钥通知,表示后续的请求都会使用协商好的对称密钥进行加密
    8. Encrypted Handshake Message

      • 使用对称密钥加密过后的握手消息,用来验证对称密钥是否工作

    HTTPS双向认证

    https双向认证指除了客户端需要验证服务器之外,服务器也需要验证客户端

    连接流程

    https双向认证流程
    https双向认证抓包

    • 步骤详解
      • 双向认证过程中的大部分步骤是相同的,只是多了服务器请求客户端证书以及客户端发送证书及签名的过程
      • 这里仅解释不同的部分
    1. Server Certificate Request
      • 服务器请求客户端证书用于验证客户端身份

    https_server_certificate_request内容

    1. Client Certificate
      • 客户端发送自己的证书或证书链

    https_client_certificate内容

    1. Client Certificate Verify
      • 与server key exchange一样,为了证明自己的身份,客户端需要使用私钥对之前的握手信息加密
      • 服务器使用客户端证书公钥解密,如果一致的话才会通过验证

    https_client_certificate_verify内容

    nginx中的配置

    ssl_certificate      /etc/nginx/cert2/server.crt; #服务器证书位置
    ssl_certificate_key  /etc/nginx/cert2/server.private;#服务器证书私钥文件位置
    ssl_client_certificate /etc/nginx/cert2/ca.crt;#用于客户端证书校验的证书文件位置,意为客户端证书必须由此证书对应的ca机构签发
    ssl_verify_client on;#是否开启客户端校验
    ssl_verify_depth 2;#客户端校验深度,如果为1的话,代表客户端证书必须由顶级ca签发
    
    

    附录

    算法组合 密钥交换 身份认证 是否会遭遇中间人攻击 是否具备前向保密 SSL 2.0 SSL 3.0 TLS 1.0 TLS 1.1 TLS 1.2 TLS 1.3(草案)
    RSA RSA RSA
    DH-RSA DH RSA
    DH-DSA DH DSA
    DHE-RSA DHE RSA
    DHE-DSA DHE DSA
    ECDH-RSA ECDH RSA
    ECDH-ECDSA ECDH ECDSA
    ECDHE-RSA DHE RSA
    ECDHE-ECDSA DHE ECDSA
    PSK PSK PSK
    PSK-RSA PSK RSA
    DHE-PSK DHE PSK
    ECDHE-PSK DHE PSK
    SRP SRP SRP
    SRP-RSA SRP RSA
    SRP-DSA SRP DSA
    DH-ANON DH
    ECDH-ANON ECDH

    参考资料

  • 相关阅读:
    Python time gmtime()方法
    背包DP整理
    hdu 1561 The more, The Better
    Eclipse无法打开提示could not open jvm.cfg错误
    Http协议
    反射类
    xml——dom&sax解析、DTD&schema约束
    XML、DTD约束
    java——final、权限修饰符
    java——接口、多态性、对象转型
  • 原文地址:https://www.cnblogs.com/hei12138/p/13228981.html
Copyright © 2011-2022 走看看