Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SSLEngine(JSSE)与旧客户端进行SSL握手_Java_Ssl_Jsse_Sslengine - Fatal编程技术网

Java 使用SSLEngine(JSSE)与旧客户端进行SSL握手

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

这是对“”的后续问题

我已经实现了一个NIO Web服务器,它可以在同一端口上处理SSL和非SSL消息。为了区分SSL消息和非SSL消息,我检查入站请求的第一个字节,看它是否是SSL/TLS消息。例如:

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中支持更多的加密类型

  • 80 4F
    是长度,高位必须设置为1(请参阅)
  • 01
    是消息类型(客户端Hello)
  • 03 00
    是受支持的最高版本(此处为SSLv3)
自Java7以来

编辑:

只是澄清一下,这不是真正的SSLv2客户机Hello,这是SSLv2格式的SSLv3客户机Hello。在这种情况下,服务器将使用(正确的)SSLv3服务器Hello(对应于
03 00
请求的版本号)进行回复。TLS 1.0、1.1和1.2也同样适用,尽管这种格式的使用逐渐被弃用

JSSE 7
SSLServerSocket
仍然会理解这样的客户机Hello,并使用SSLv3/TLS1.x服务器Hello适当地进行回复。

这看起来像:

支持SSL版本2.0服务器的TLS 1.1客户端必须发送SSL 2.0版客户端hello消息[SSL2]。TLS服务器应接受 如果客户机希望在上支持SSL 2.0客户机,则可以使用hello格式 相同的连接端口。与2.0版的唯一偏差 规范是指定值为的版本的能力 三是在CipherSpec中支持更多的加密类型

  • 80 4F
    是长度,高位必须设置为1(请参阅)
  • 01
    是消息类型(客户端Hello)
  • 03 00
    是受支持的最高版本(此处为SSLv3)
自Java7以来

编辑:

只是澄清一下,这不是真正的SSLv2客户机Hello,这是SSLv2格式的SSLv3客户机Hello。在这种情况下,服务器将使用(正确的)SSLv3服务器Hello(对应于
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