gpt4 book ai didi

java - SSL 握手失败 Java

转载 作者:太空宇宙 更新时间:2023-11-03 14:39:35 25 4
gpt4 key购买 nike

我在学习 SSL 通信时遇到了这个问题。我正在编写一个简单的客户端,它试图与本地 apache 服务器握手。服务器已启用 https。我将服务器证书添加到所有可能的信任库(jdk 中的一个和程序使用的那个)。但是握手状态永远不会达到 FINISHED。一直卡在NEED_TASK状态我在第一次进入循环时得到一个 sun.security.ssl.Handshaker$DelegatedTask。此后状态为 NEED_TASK,任务为空。.我对以下代码的理解错误\缺陷在哪里?

注意:我从以下教程中获取了代码:

http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#KRB

卡在 NEED_TASK 状态的握手代码如下:

void doHandshake(SocketChannel socketChannel, SSLEngine engine,
ByteBuffer myNetData, ByteBuffer peerNetData) throws Exception {

// Create byte buffers to use for holding application data
int appBufferSize = engine.getSession().getApplicationBufferSize();
ByteBuffer myAppData = ByteBuffer.allocate(appBufferSize);
ByteBuffer peerAppData = ByteBuffer.allocate(appBufferSize);
// Begin handshake
engine.beginHandshake();
SSLEngineResult.HandshakeStatus hs = engine.getHandshakeStatus();
int i=0;
// Process handshaking message
while (hs != SSLEngineResult.HandshakeStatus.FINISHED &&
hs != SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING) {
i++;
switch (hs) {

case NEED_UNWRAP:
// Receive handshaking data from peer
if (socketChannel.read(peerNetData) < 0) {
// The channel has reached end-of-stream
}

// Process incoming handshaking data
peerNetData.flip();
SSLEngineResult res = engine.unwrap(peerNetData, peerAppData);
peerNetData.compact();
hs = res.getHandshakeStatus();

// Check status
switch (res.getStatus()) {
case OK :
// Handle OK status
break;

// Handle other status: BUFFER_UNDERFLOW, BUFFER_OVERFLOW, CLOSED

}
break;

case NEED_WRAP :
// Empty the local network packet buffer.
myNetData.clear();

// Generate handshaking data
res = engine.wrap(myAppData, myNetData);
hs = res.getHandshakeStatus();

// Check status
switch (res.getStatus()) {
case OK :
myNetData.flip();

// Send the handshaking data to peer
while (myNetData.hasRemaining()) {
socketChannel.write(myNetData);
}
break;

// Handle other status: BUFFER_OVERFLOW, BUFFER_UNDERFLOW, CLOSED

}
break;

case NEED_TASK :
Runnable task =engine.getDelegatedTask();
if(task!= null) {
//task.run();
new Thread(task).start();
}// Handle blocking tasks

break;

// Handle other status: // FINISHED or NOT_HANDSHAKING

}
}
// Processes after handshaking

}

如有任何帮助,我们将不胜感激。

最佳答案

问题是我对 engine.getHandShakeStatus() 方法的理解不完整。

我把上面的代码改成了

 case NEED_TASK :
Runnable task =engine.getDelegatedTask();
if(task!= null) {
//task.run();
new Thread(task).start();
}
hs = engine.getHandshakeStatus();
break;

现在它完成了握手

关于java - SSL 握手失败 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44359868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com