面试题答案
一键面试HTTPS握手过程
- 客户端发起请求:
- 客户端向服务器发送一个
ClientHello
消息,其中包含以下信息:- 客户端支持的SSL/TLS协议版本,如TLS 1.2、TLS 1.3等。
- 客户端支持的加密套件列表,例如
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
等,这些套件定义了密钥交换算法、加密算法、消息认证码算法等。 - 一个随机数
ClientRandom
,用于后续生成会话密钥。
- 客户端向服务器发送一个
- 服务器响应:
- 服务器收到
ClientHello
后,返回ServerHello
消息,包含以下内容:- 服务器选择的SSL/TLS协议版本,一般会从客户端支持的版本中选择一个最高且服务器也支持的版本。
- 服务器选择的加密套件,从客户端提供的列表中选取。
- 一个随机数
ServerRandom
。
- 接着服务器发送
Certificate
消息,包含服务器的数字证书,证书中包含服务器的公钥、证书颁发机构(CA)的签名等信息。 - 若服务器需要客户端认证(可选),会发送
CertificateRequest
消息,要求客户端提供证书。 - 最后发送
ServerHelloDone
消息,表明服务器的Hello阶段结束。
- 服务器收到
- 客户端验证与密钥交换:
- 客户端验证服务器证书的合法性,包括检查证书是否由受信任的CA颁发、证书是否过期、证书中的域名是否与请求的域名匹配等。
- 若服务器要求客户端认证,客户端发送
Certificate
消息提供自己的证书(若有)。 - 客户端生成一个预主密钥(
Pre - Master Secret
),使用服务器证书中的公钥加密后,通过ClientKeyExchange
消息发送给服务器。 - 客户端和服务器根据
ClientRandom
、ServerRandom
和Pre - Master Secret
,使用相同的密钥推导函数计算出会话密钥(如Master Secret
,进而衍生出用于加密和解密的对称密钥)。 - 客户端发送
ChangeCipherSpec
消息,通知服务器后续消息将使用协商好的加密套件和密钥进行加密。 - 客户端发送
Finished
消息,该消息使用新的密钥和加密算法进行保护,内容是对之前握手消息的摘要,用于验证握手过程的完整性。
- 服务器响应并完成握手:
- 服务器收到
ChangeCipherSpec
后,切换到新的加密套件和密钥。 - 服务器发送
ChangeCipherSpec
消息,通知客户端已切换加密状态。 - 服务器发送
Finished
消息,同样使用新密钥加密,内容也是对之前握手消息的摘要,用于验证握手完整性。 - 至此,握手完成,客户端和服务器可以使用协商好的密钥进行安全通信。
- 服务器收到
安全隐患及防范措施
- 中间人攻击:
- 隐患:攻击者拦截客户端与服务器之间的通信,冒充服务器向客户端发送伪造的证书,或者冒充客户端向服务器发送请求,从而窃取或篡改数据。
- 防范:客户端严格验证服务器证书,只信任由受信任的CA颁发的证书。CA应采用严格的证书颁发流程,如对域名所有权等进行验证。使用证书钉扎(Certificate Pinning)技术,客户端预先保存服务器证书的指纹,每次连接时验证证书指纹是否匹配,防止中间人替换证书。
- 弱加密套件:
- 隐患:若使用的加密套件存在安全漏洞,如某些旧的加密算法易被破解,可能导致数据被解密或伪造。
- 防范:服务器和客户端及时更新,禁用不安全或弱的加密套件,只使用经过安全评估的强加密套件。定期关注安全公告,及时了解加密套件的安全状况。
- 证书过期或吊销:
- 隐患:过期或吊销的证书意味着服务器的身份不再可靠,可能被冒用。
- 防范:服务器及时更新证书,避免证书过期。客户端验证证书时,检查证书的有效期和吊销状态,可通过证书吊销列表(CRL)或在线证书状态协议(OCSP)进行验证。
- 心跳漏洞(针对旧TLS版本):
- 隐患:如OpenSSL库中的Heartbleed漏洞,攻击者可通过精心构造的心跳请求,获取服务器内存中的敏感信息,如私钥等。
- 防范:及时更新服务器的SSL/TLS相关库到最新版本,修复已知漏洞。定期进行安全扫描,检测服务器是否存在此类漏洞。