gpt4 book ai didi

JAVA SSLENGINE : Unsupported record version Unknown-0. 0 尝试使用 SSLEngine 解开字节缓冲区记录时

转载 作者:太空宇宙 更新时间:2023-11-04 14:13:57 29 4
gpt4 key购买 nike

我正在使用 Java NIO 上的 SSLEngine 来解锁服务器套接字来处理连接。我能够成功地与客户端握手并将小记录集传递到服务器。但是,当我尝试将文件传输到服务器 text/binary 时,出现以下错误:

javax.net.ssl.SSLException: Unsupported record version Unknown-0.0
at sun.security.ssl.InputRecord.checkRecordVersion(InputRecord.java:552)
at sun.security.ssl.EngineInputRecord.bytesInCompletePacket(EngineInputRecord.java:113)
at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:862)
at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:775)
at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
at ncp.io.network.tls.TLSWrapper.unwrap(TLSWrapper.java:170)
at ncp.io.network.tls.TLSIO.decodeData(TLSIO.java:110)
at ncp.io.network.tls.TLSIO.handleRead(TLSIO.java:71)
at ncp.io.network.SocketThread.run(SocketThread.java:137)

但是我无法找出此错误的原因。

下面是我的代码片段

@Override
public int handleRead(ByteBuffer temp) {

int read = opsManager.handleRead(temp);

if (read > 0) {

try {
tlsDecodeBuffer = decodeData(temp);

try {
temp.clear();
temp.put(tlsDecodeBuffer);
}catch (BufferOverflowException e){
temp = ByteBuffer.allocateDirect(tlsDecodeBuffer.remaining());
temp.put(tlsDecodeBuffer);
}

temp.flip();
temp.rewind();

if(tlsDecodeBuffer.hasRemaining())
tlsDecodeBuffer.compact();
else
tlsDecodeBuffer.clear();

}catch (SSLException e){
// Error occurs here:
e.printStackTrace();
log.warning("Insecure connection attempted/ SSL failure for:" + e.getMessage());
opsManager.close();
}
catch (IOException e) {
e.printStackTrace();
}

return read;
} else {
return -1;
}
}

private ByteBuffer decodeData(ByteBuffer input) throws IOException {
ncp.io.network.tls.TLSStatus stat = null;
boolean continueLoop = true;

do {

tlsDecodeBuffer = wrapper.unwrap(input, tlsDecodeBuffer);

switch (wrapper.getStatus()) {
case NEED_WRITE:
writeBuff(ByteBuffer.allocate(0));
break;

case UNDERFLOW:
if (tlsDecodeBuffer.capacity() == tlsDecodeBuffer.remaining()) {
throw new BufferUnderflowException();
} else {
input.compact();
continueLoop = false;
}

break;
case CLOSED:
if (log.isLoggable(Level.FINER)) {
log.finer("TLS Socket closed..." + toString());
}

throw new EOFException("Socket has been closed.");
default:
break;
}

stat = wrapper.getStatus();

} while (continueLoop && ((stat == TLSStatus.NEED_READ) || (stat == TLSStatus.OK))
&& input.hasRemaining());

if (continueLoop) {
if (input.hasRemaining()) {
input.rewind();
} else {
input.clear();
}
}

tlsDecodeBuffer.flip();
return tlsDecodeBuffer;
}

最佳答案

你的代码没有意义。

  1. 当您在 unwrap() 中遇到 BufferOverflowException 时,您需要通过 flip()/get()/compact() 清空目标缓冲区。

  2. 当您在 wrap() 中收到 BufferOverflowException 时,您需要通过 flip()/write()/compact() 清空目标缓冲区,其中 write() 会连接到网络。

    在这两种情况下,分配新的缓冲区等都没有任何意义。

  3. rewind() after flip() 在任何上下文中都没有意义。

这里有很多关于如何正确使用 SSLEngine 的帖子和答案。我建议您仔细阅读它们。

关于JAVA SSLENGINE : Unsupported record version Unknown-0. 0 尝试使用 SSLEngine 解开字节缓冲区记录时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27978447/

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