这是一个后续问题“ SSL握手使用自签名的证书和SSLEngine的(JSSE) ”。
我实现了一个网络服务器NIO可在同一个端口上处理SSL和非SSL消息。 为了SSL和非SSL消息之间进行区分,我检查入站请求的第一个字节,看它是否是一个SSL / TLS消息。 例:
byte a = read(buf);
if (totalBytesRead==1 && (a>19 && a<25)){
parseTLS(buf);
}
在parseTLS()方法我实例化的SSLEngine,启动握手,包装/解包的消息,等一切都显得做工精细大多数现代Web浏览器(Firefox 10,IE 9,Safari 5的,等等)。
问题是,旧的Web浏览器如IE 6和类似Java的URLConnection类库似乎会以不同启动SSL / TLS握手。 例如,从IE 6的前几个字节看起来像这样(十六进制的值):
80 4F 01 03 00 ...
如果我将消息传递给了SSLEngine的,它似乎并没有认识到的消息,并抛出一个异常。
javax.net.ssl.SSLException: Unsupported record version Unknown-0.0
那么究竟什么是IE 6和Java的URLConnection类在发送? 这是一个有效的SSL / TLS消息的JSSE的SSLEngine能支持吗? 我必须做一些预处理或与客户协商发送不同的信息?
提前致谢!
UPDATE
感谢布鲁诺和EJP和一些进一步的调试我有一个更好的了解这是怎么回事的。 正如布鲁诺正确地指出,在IE6和Java 6个客户端发送一个以上的SSLv2客户问候。 相反,我早先的评论一个,在Java 1.6的SSLEngine其实可以解开的的SSLv2消息,并生成发送回客户端有效的响应。 我先前报告的异常SSLException是站在我这边的错误,无关与SSLEngine的(我错误地假定客户端已完成了发送数据,我结束了在SSLEngine的期待更多的数据来解开一个空字节缓冲区)。