JavaSSL:chrome/firefox在http头中发送“G”,而不是“GET/http/1.1”
您好,我正在试用一个简单的java http服务器NanoHTTPD: 今天我尝试用HTTPS支持它,所以我在它的NanoHTTPD构造函数中创建了SSLServerSocket:JavaSSL:chrome/firefox在http头中发送“G”,而不是“GET/http/1.1”,java,google-chrome,firefox,ssl,nanohttpd,Java,Google Chrome,Firefox,Ssl,Nanohttpd,您好,我正在试用一个简单的java http服务器NanoHTTPD: 今天我尝试用HTTPS支持它,所以我在它的NanoHTTPD构造函数中创建了SSLServerSocket: // myServerSocket = new ServerSocket(myTcpPort); myServerSocket = SSLServerSocketFactory.getDefault().createServerSocket(myTcpPort); 还提供了带有2048位RSA密钥的javax.ne
// myServerSocket = new ServerSocket(myTcpPort);
myServerSocket = SSLServerSocketFactory.getDefault().createServerSocket(myTcpPort);
还提供了带有2048位RSA密钥的javax.net.ssl.keyStore
结果是https连接在MSIE6.0、MSIE8.0、Firefox 9.0.1上成功
但是,在Google Chrome 17.0.963.56 m和Firefox 10.0.1上失败:
通过调试,NanoHTTPD.HTTPSession.decodeHeader方法仅获取字符串inLine=G,仅获取一个字符,而通常在这里您会期望标准http头GET/http/1.1
所以任何熟悉Firefox的人都可以看出9.0.1和10.0.1中关于https/ssl的不同之处?浏览器制作的东西可能是重点。当然,我是java ssl编程的新手,请告诉我SSLServerSocket是否有错
我交叉发布了本期:
谢谢大家。问题在于您的SSL实现被破坏了。SSL记录可以以任意方式拆分,Google和Mozilla改变了拆分记录的方式,以解决一些针对SSL的MITM攻击。具体地说,在发送第二个SSL记录和其余数据之前,先发送一个1字节的SSL记录。听起来SSL实现只是读取第一条记录,而不是读取所有数据
请参阅和类似的文章我可以确认,默认情况下,来自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看起来会正常工作。您必须循环多次读取,其间有一些间歇状态,最终您将获得完整的块。如果您能让所有用户更改浏览器设置以降低安全性就好了。不过,这对调试很有帮助。