MST
星途 面试题库

面试题:网络编程:HTTPS握手过程及安全隐患分析

描述HTTPS完整的握手过程,包括客户端和服务器之间交互的各个步骤及传递的信息。同时,分析在这个过程中可能存在哪些安全隐患,以及如何防范。
16.5万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试

HTTPS握手过程

  1. 客户端发起请求
    • 客户端向服务器发送一个ClientHello消息,其中包含以下信息:
      • 客户端支持的SSL/TLS协议版本,如TLS 1.2、TLS 1.3等。
      • 客户端支持的加密套件列表,例如TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384等,这些套件定义了密钥交换算法、加密算法、消息认证码算法等。
      • 一个随机数ClientRandom,用于后续生成会话密钥。
  2. 服务器响应
    • 服务器收到ClientHello后,返回ServerHello消息,包含以下内容:
      • 服务器选择的SSL/TLS协议版本,一般会从客户端支持的版本中选择一个最高且服务器也支持的版本。
      • 服务器选择的加密套件,从客户端提供的列表中选取。
      • 一个随机数ServerRandom
    • 接着服务器发送Certificate消息,包含服务器的数字证书,证书中包含服务器的公钥、证书颁发机构(CA)的签名等信息。
    • 若服务器需要客户端认证(可选),会发送CertificateRequest消息,要求客户端提供证书。
    • 最后发送ServerHelloDone消息,表明服务器的Hello阶段结束。
  3. 客户端验证与密钥交换
    • 客户端验证服务器证书的合法性,包括检查证书是否由受信任的CA颁发、证书是否过期、证书中的域名是否与请求的域名匹配等。
    • 若服务器要求客户端认证,客户端发送Certificate消息提供自己的证书(若有)。
    • 客户端生成一个预主密钥(Pre - Master Secret),使用服务器证书中的公钥加密后,通过ClientKeyExchange消息发送给服务器。
    • 客户端和服务器根据ClientRandomServerRandomPre - Master Secret,使用相同的密钥推导函数计算出会话密钥(如Master Secret,进而衍生出用于加密和解密的对称密钥)。
    • 客户端发送ChangeCipherSpec消息,通知服务器后续消息将使用协商好的加密套件和密钥进行加密。
    • 客户端发送Finished消息,该消息使用新的密钥和加密算法进行保护,内容是对之前握手消息的摘要,用于验证握手过程的完整性。
  4. 服务器响应并完成握手
    • 服务器收到ChangeCipherSpec后,切换到新的加密套件和密钥。
    • 服务器发送ChangeCipherSpec消息,通知客户端已切换加密状态。
    • 服务器发送Finished消息,同样使用新密钥加密,内容也是对之前握手消息的摘要,用于验证握手完整性。
    • 至此,握手完成,客户端和服务器可以使用协商好的密钥进行安全通信。

安全隐患及防范措施

  1. 中间人攻击
    • 隐患:攻击者拦截客户端与服务器之间的通信,冒充服务器向客户端发送伪造的证书,或者冒充客户端向服务器发送请求,从而窃取或篡改数据。
    • 防范:客户端严格验证服务器证书,只信任由受信任的CA颁发的证书。CA应采用严格的证书颁发流程,如对域名所有权等进行验证。使用证书钉扎(Certificate Pinning)技术,客户端预先保存服务器证书的指纹,每次连接时验证证书指纹是否匹配,防止中间人替换证书。
  2. 弱加密套件
    • 隐患:若使用的加密套件存在安全漏洞,如某些旧的加密算法易被破解,可能导致数据被解密或伪造。
    • 防范:服务器和客户端及时更新,禁用不安全或弱的加密套件,只使用经过安全评估的强加密套件。定期关注安全公告,及时了解加密套件的安全状况。
  3. 证书过期或吊销
    • 隐患:过期或吊销的证书意味着服务器的身份不再可靠,可能被冒用。
    • 防范:服务器及时更新证书,避免证书过期。客户端验证证书时,检查证书的有效期和吊销状态,可通过证书吊销列表(CRL)或在线证书状态协议(OCSP)进行验证。
  4. 心跳漏洞(针对旧TLS版本)
    • 隐患:如OpenSSL库中的Heartbleed漏洞,攻击者可通过精心构造的心跳请求,获取服务器内存中的敏感信息,如私钥等。
    • 防范:及时更新服务器的SSL/TLS相关库到最新版本,修复已知漏洞。定期进行安全扫描,检测服务器是否存在此类漏洞。