2

您好我正在尝试一个简单的 java http 服务器 NanoHTTPD:http: //elonen.iki.fi/code/nanohttpd/

今天我尝试用 HTTPS 支持它,所以我SSLServerSocket在它的NanoHTTPD构造函数中创建:

// myServerSocket = new ServerSocket(myTcpPort);
myServerSocket = SSLServerSocketFactory.getDefault().createServerSocket(myTcpPort);

并且还提供javax.net.ssl.keyStore了 2048 位 RSA 密钥

结果是 https 连接在 MSIE6.0、MSIE8.0、Firefox 9.0.1 上成功但在 Google Chrome 17.0.963.56 m 和 Firefox 10.0.1 上失败:

从调试中,NanoHTTPD.HTTPSession.decodeHeader方法只得到String inLine = "G"一个字符,而通常在这里你会期望标准的 http 标头“ GET / HTTP/1.1”。

所以任何熟悉 Firefox 的人都可以说出 9.0.1 和 10.0.1 关于 https / ssl 的不同之处?浏览器制作的东西可能是重点。(当然我是java ssl编程的新手,如果我在SSLServerSocket中错了,请告诉我)。

我已经交叉发布了这个问题: https: //support.mozilla.org/en-US/questions/920116

谢谢你们。

4

2 回答 2

4

简而言之,您的 SSL 实现已损坏。SSL 记录可以以任意方式拆分,Google 和 Mozilla 改变了拆分方式以解决对 SSL 的一些 MITM 攻击。具体来说,在发送带有其余数据的第二个 SSL 记录之前发送一个 1 字节的 SSL 记录。听起来您的 SSL 实现只是读取第一条记录,而不是读取所有数据。

请参阅http://rt.openssl.org/Ticket/Display.html?id=2635&user=guest&pass=guesthttps://bugzilla.mozilla.org/show_bug.cgi?id=665814以及类似http://www的文章.livehacking.com/2011/10/27/chrome-15-broke-the-wall-street-journal-while-trying-to-beat-the-beast/

于 2012-02-20T14:00:12.700 回答
1

我可以确认来自 java 的 SSLEngine 默认出现损坏。我可以绕过它的方法是:

^Cpck0:bin vladimirralev$ /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --disable-ssl-false-start --use-spdy=off --use-system-ssl

这会关闭奇怪的 TLS 模式。

如果您继续遵循它为您提供的读取分段数据包的说明,最近的 SSLEngine 似乎会正常运行。您必须循环多次读取(中间有一些间歇性状态),最终您将拥有完整的块。

于 2012-09-25T06:42:36.610 回答