嗨:我正在尝试制作一个小型HTTPS客户端程序,主要是使用JAVA。
以下是代码段:
SSLSocket result = (SSLSocket) SSLCont.sslSocketFactory.createSocket(
sockfd, "www.facebook.com", 443, false);
result.startHandshake();
result.getOutputStream().write("GET / HTTP/1.1\r\nHost: www.facebook.com\r\n\r\n".getBytes());
String res=my.getData(result.getInputStream());
print(res);
我可以正确打印Facebook回复。没有问题。
问题是 - 当我使用“TRAFFIC capture”程序看到流量时,我看到以下数据为“TLS:TLS Rec Layer-1握手:客户端Hello”。部分
TLS:TLS Rec Layer-1 HandShake: Client Hello.
. .....ÿÿÿÿ.............ïM©.LoÓ....??ÞÐJd:Ôn..¡.?ÞÐJd:..ªª.....
.E..ë.×@.@.».À¨.eð.$?6.»§.Îç?ç.?P.ý\?-
......¾...º..???v????{3?¯ß.DÅJ.>?÷®ÿ±û*^».8i1...À+À/̨̩À,À0À.À.À
.À..3.9./.5.....s.........www.facebook.com....ÿ.
........................#...............................
..........................
但是,当我直接在浏览器中打开网站(www.facebook.com)时,在CHROME中,我看到以下流量:
TLS:TLS Rec Layer-1 HandShake: Client Hello.
. .....ÿÿÿÿ.............ïM©.LoÓ....??ÞÐJd:Ôn..¡.?ÞÐJd:..ªª.....
.E..ë.×@.@.».À¨.eð.$?6.»§.Îç?ç.?P.ý\?-
......¾...º..???v????{3?¯ß.DÅJ.>?÷®ÿ±û*^».8i1...À+À/̨̩À,À0À.À.À
.À..3.9./.5.....s.........www.facebook.com....ÿ.
........................#.........h2.http/1.1...........
..........................
如果我们仔细比较两个流量数据,我们会看到,如果Chrome浏览器生成流量,我们会看到以下额外字符串 “.. h2.http / 1.1 ....”最后附加,告诉它是HTTP,看起来很完美。
但是这个字符串没有附加在我的java程序生成的流量中。
你能告诉我为什么“ .. h2.http / 1.1 .... ”字符串没有出现在我的java程序生成的流量中。 如何修改我的java代码,以便字符串出现在我的java程序生成的请求流量中。
注意:但是当我使用java内置类“ HttpsURLConnection ”打开该网站时,我看到“ .. h2.http / 1.1 .... ”存在在交通中。 此问题适用于所有HTTPS网站。
请告诉我我的Java代码中缺少什么。
提前谢谢
答案 0 :(得分:0)
请告诉我为什么“..h2.http / 1.1 ....”字符串没有出现在我的java程序生成的流量中。
首先,在分析二进制协议(如TLS)时,将其视为文本并不是一个好主意。如果您使用Wireshark查看流量并深入挖掘TLS握手,您会看到客户端使用ALPN向服务器指示它支持'h2'(HTTP / 2)和'http / 1.1'(HTTP / 1.1)。支持HTTP / 2的服务器可能会使用它作为连接的协议而不是HTTP / 1.1,因为HTTP / 2更有效。
如何修改我的java代码,以便字符串出现在我的java程序生成的请求流量中。
除非您能够使用HTTP / 2协议正确地与服务器通信,否则您不希望告诉服务器您可以执行HTTP / 2,即您不希望将此信息与ALPN一起添加。鉴于您刚刚设法发送HTTP请求但未能正确处理响应(您希望服务器在响应后关闭连接,尽管您允许服务器通过使用HTTP /隐式启用HTTP keep-alive来保持连接打开1.1)我怀疑你能否采用更复杂的HTTP / 2协议。