这已经让我发疯好几天了。我使用java创建了一个客户端,并使用SSLEngine进行ssl加密。握手很好,我给一个网站写了一个GET请求,它很好(我用200个代码获得了标题)。问题是,当网站将数据包发回时,在第二个数据包上,我会得到一个BadPaddingException。下面是我的阅读方法:
public void read(SelectionKey key,ByteBuffer readBuffer) throws IOException, BadPaddingException {
SocketChannel socketChannel = (SocketChannel) key.channel();
ByteBuffer clientSSLData = ByteBuffer.allocate(getPacketBufferSize());
System.out.println("Reading data. PacketBufferSize: "+(getPacketBufferSize()));
int length = socketChannel.read(clientSSLData);
System.out.println("read "+length+" bytes");
if (length == -1){
System.out.println("Length is -1 which means nothing was read from the channel ");
socketChannel.close();
return;
}
clientSSLData.flip();
readBuffer.clear();
SSLEngineResult res = sslEngine.unwrap(clientSSLData, readBuffer);
System.out.println(res.toString());
}我的get请求很简单,如:"GET \r\n nHost: www.google.com\r\n\r\n“
基本上,如果它是一个小网站,如https://www.example.com,我没有问题接收,因为它发送它在一次阅读。但是如果我做了像https://www.google.com这样的事情,我就会得到BadPaddingException。有什么想法吗?谢谢!
编辑:例外是..。
sun.security.ssl.Alerts.getSSLException(Unknown (未知源),sun.security.ssl.SSLEngineImpl.fatal(未知源),sun.security.ssl.SSLEngineImpl.readNetRecord(Unknown (源),sun.security.ssl.SSLEngineImpl.unwrap(未知源),javax.net.ssl.SSLEngine.unwrap(未知源),ssl.engine (未知源)ssl.engine.impl.ChannelHandler.read(ChannelHandler.java:144) at ssl.engine.impl.ChannelHandler.run(ChannelHandler.java:69) at java.lang.Thread.run(不明来源)的.impl.SecureIO.read(SecureIO.java:244)由: javax.crypto.BadPaddingException: sun.security.ssl.EngineInputRecord.decrypt(Unknown Source上的坏记录MAC造成的.8 moreClosing下降
发布于 2013-11-20 04:56:43
你做错了。当您需要获取数据时,您应该:
unwrap().同样,当您需要放置数据时,您应该:
wrap().或者当你需要冲洗的时候做所有的事情。
您的主要接口应该是与引擎,并且只与通道,因为引擎告诉你关于缓冲区的潜流和溢出。
类似地,您必须让引擎指定握手( engine _WRAP/ must _UNWRAP),而不是尝试对其进行口授。
SSLEngine是一件很难纠正的事情。许多人尝试过,很少有人成功。要想获得成功,这是商业产品的基础,请参阅我的书“,Springer 2006,这里”的源代码中的这里类。
https://stackoverflow.com/questions/20085490
复制相似问题