You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSLSocket中getSession、getHandshakeSession与startHandshake的双向SSL差异问询

SSLSocket相关方法与握手机制解析

SSLSocket中的核心会话方法

SSLSocket定义了以下两个与会话相关的方法:

public abstract SSLSession getSession();
public SSLSession getHandshakeSession() {
    throw new UnsupportedOperationException();
}

1. session.startHandshake() 的作用

不管是通过getSession()还是getHandshakeSession()获取的SSLSession实例,调用startHandshake()的核心作用是主动触发(或重新触发)SSL/TLS握手流程:

  • 若当前未建立安全会话,会启动完整握手:协商加密套件、交换证书、生成会话密钥,最终建立安全通信通道。
  • 若已有活跃会话,调用该方法会启动重新握手,可用于更新会话密钥、重新验证身份或切换加密策略。

2. 双向SSL场景下三者的差异

在双向SSL(客户端与服务器互相认证)场景中,三者的角色和行为差异清晰:

  • getSession():
    • 返回已完成握手、处于活跃状态的SSL会话。如果当前无活跃会话,调用该方法会自动触发完整双向握手(服务器验证客户端证书,客户端验证服务器证书),直至握手成功才返回会话对象。
    • 返回的会话代表双向认证已完成,可直接用于安全通信。
  • getHandshakeSession():
    • 默认实现抛出UnsupportedOperationException,部分自定义SSLSocket实现会返回正在进行中的握手会话,或最近一次握手(无论成功与否)的会话快照。
    • 它不会自动触发握手,仅用于获取握手过程中的临时状态(比如未完成客户端认证的半握手会话、握手失败的会话信息),多用于调试或监控握手流程。
  • startHandshake():
    • 是主动执行动作的方法,强制启动(或重启)双向SSL握手流程,不受当前是否存在活跃会话的限制。
    • 执行时会严格走双向认证流程:服务器发送证书供客户端验证,客户端发送自身证书供服务器验证,双方协商会话密钥,最终完成安全会话的建立或更新。

3. Java握手时传入的keystore是否会被SSLSession考量

会被考量,keystore是SSLSession建立的核心依赖:

  • keystore中存储的服务器/客户端证书链会在握手时交换,SSLSession会保存这些证书信息(可通过SSLSession.getPeerCertificates()等方法获取),作为身份认证的依据。
  • keystore中的私钥会用于握手过程中的签名操作(比如客户端认证时用私钥签名证明身份),是完成双向认证的必要条件。
  • 会话复用机制也会基于keystore中的凭证信息判断:只有当复用的会话与当前keystore中的凭证匹配时,才能成功复用会话,避免重复握手。

内容的提问来源于stack exchange,提问作者shweta kadam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:12:49