使用JSSE的SSLEngine非阻塞握手时,NEED_WRAP需传入什么数据?
JSSE中SSLEngine NEED_WRAP状态的处理说明
当SSLEngine处于握手阶段并返回NEED_WRAP状态时,完全可以传入空的myAppData ByteBuffer,这不会导致握手失败——握手所需的协议数据是SSLEngine自动生成的,不需要你提供应用层数据。
核心逻辑:
- SSL/TLS握手过程中的各类消息(比如ClientHello、ServerHello、密钥交换数据等),都是由SSLEngine内部根据握手流程自动构造的,和应用层业务数据无关。
- 调用
engine.wrap(myAppData, myNetData)时,只要myNetData有足够的容量(可通过engine.getSession().getPacketBufferSize()获取推荐大小),SSLEngine就会把生成的握手协议数据写入myNetData,你只需要将myNetData中的数据发送给对端即可推进握手。 - 文档示例里使用空
myAppData是标准且正确的做法,不用担心握手无法完成。
处理NEED_WRAP的标准步骤:
- 准备空的
myAppData(如果当前没有待发送的应用数据)和足够容量的myNetData - 调用
engine.wrap(myAppData, myNetData) - 将
myNetData中的数据发送至网络端 - 继续处理SSLEngine返回的新握手状态,直到握手完成
内容的提问来源于stack exchange,提问作者Theodore
相关产品推荐
相关产品推荐

