Java 使用SSLEngine(JSSE)与旧客户端进行SSL握手
这是对“”的后续问题 我已经实现了一个NIO Web服务器,它可以在同一端口上处理SSL和非SSL消息。为了区分SSL消息和非SSL消息,我检查入站请求的第一个字节,看它是否是SSL/TLS消息。例如:Java 使用SSLEngine(JSSE)与旧客户端进行SSL握手,java,ssl,jsse,sslengine,Java,Ssl,Jsse,Sslengine,这是对“”的后续问题 我已经实现了一个NIO Web服务器,它可以在同一端口上处理SSL和非SSL消息。为了区分SSL消息和非SSL消息,我检查入站请求的第一个字节,看它是否是SSL/TLS消息。例如: byte a = read(buf); if (totalBytesRead==1 && (a>19 && a<25)){ parseTLS(buf); } 如果我将消息传递给SSLEngine,它似乎无法识别该消息并抛出异常 javax.n
byte a = read(buf);
if (totalBytesRead==1 && (a>19 && a<25)){
parseTLS(buf);
}
如果我将消息传递给SSLEngine,它似乎无法识别该消息并抛出异常
javax.net.ssl.SSLException: Unsupported record version Unknown-0.0
那么IE6和Java的URLConnection类到底发送了什么呢?这是JSSE SSLEngine可以支持的有效SSL/TLS消息吗?我是否需要做一些预处理或与客户协商以发送不同的消息
提前谢谢
更新
多亏了Bruno和EJP以及一些进一步的调试,我对正在发生的事情有了更好的理解。正如Bruno正确指出的那样,IE6和Java6客户机正在通过SSLv2 ClientHello发送数据。与我前面的一条评论相反,Java1.6中的SSLEngine实际上可以打开SSLv2消息并生成有效响应以发送回客户端。我之前报告的SSLException是我这边的一个错误,与SSLEngine无关(我错误地认为客户端已完成数据发送,当SSLEngine希望打开更多数据时,我得到了一个空ByteBuffer)。这看起来像:
支持SSL版本2.0服务器的TLS 1.1客户端必须发送SSL
2.0版客户端hello消息[SSL2]。TLS服务器应接受
如果客户机希望在上支持SSL 2.0客户机,则可以使用hello格式
相同的连接端口。与2.0版的唯一偏差
规范是指定值为的版本的能力
三是在CipherSpec中支持更多的加密类型
是长度,高位必须设置为1(请参阅)80 4F
是消息类型(客户端Hello)01
是受支持的最高版本(此处为SSLv3)03 00
03 00
请求的版本号)进行回复。TLS 1.0、1.1和1.2也同样适用,尽管这种格式的使用逐渐被弃用
JSSE 7SSLServerSocket
仍然会理解这样的客户机Hello,并使用SSLv3/TLS1.x服务器Hello适当地进行回复。这看起来像:
支持SSL版本2.0服务器的TLS 1.1客户端必须发送SSL
2.0版客户端hello消息[SSL2]。TLS服务器应接受
如果客户机希望在上支持SSL 2.0客户机,则可以使用hello格式
相同的连接端口。与2.0版的唯一偏差
规范是指定值为的版本的能力
三是在CipherSpec中支持更多的加密类型
是长度,高位必须设置为1(请参阅)80 4F
是消息类型(客户端Hello)01
是受支持的最高版本(此处为SSLv3)03 00
03 00
请求的版本号)进行回复。TLS 1.0、1.1和1.2也同样适用,尽管这种格式的使用逐渐被弃用
JSSE7
SSLServerSocket
仍然会理解这样的客户机Hello,并使用SSLv3/TLS1.x服务器Hello适当地回复。谢谢。根据[参考指南]SUN的SSLEngine不支持SSLv2。那么我应该向客户端发送什么?只需关闭连接?它不支持,但它支持使用此SSLv2 ClientHello启动的更高版本的SSL/TLS(如果支持的版本指示为SSLv3或TLS 1.x):它将使用SSLv3服务器回复以80 4F 01 03 00
开头的消息。很抱歉,我太早按了enter键。您是说我应该使用SSLv3服务器回复SSLv2客户端Hello?是的,取决于支持的版本(这里是03 00
->SSLv3,03 01
->TLSv1.0,03 02
->TLSv1.1,…)。您建议我使用什么api来生成响应?SSLEngine中的展开方法似乎对我不起作用。谢谢。根据[参考指南]SUN的SSLEngine不支持SSLv2。那么我应该向客户端发送什么?只需关闭连接即可?它不支持,但它确实支持使用此SSLv2 ClientHello启动的更高版本的SSL/TLS(如果支持的版本指示为SSLv3或TLS 1.x):它将使用SSLv3服务器回复以80 4F 01 03 00
开头的消息。很抱歉,我太早按了enter键。您是说我应该使用SSLv3服务器回复SSLv2客户端Hello?是的,取决于支持的版本(这里是03 00
->SSLv3,03 01
->TLSv1.0,03 02
->TLSv1.1,…)。您建议我使用什么api来生成响应?SSLEngine中的展开方法似乎对我不起作用。
javax.net.ssl.SSLException: Unsupported record version Unknown-0.0