使用HttpsURLConnection时HTTPS GET请求中有多余的数据吗?

时间:2018-08-10 16:29:30

标签: java jenkins httpsurlconnection

上下文:尝试通过Java的HttpsURLConnection类从Jenkins CI服务器获取面包屑时,我收到400错误。我编写的Python实用程序使调用成功完成,而wget却没有问题。这是Java代码:

String crumb_url = JENKINS_URL + "crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\":\",//crumb)";
String userpass = config.getProperty("USERNAME") + ":" + config.getProperty("API_TOKEN");
String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes());

URL url = new URL(crumb_url);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(sslFactory);

conn.setRequestMethod("GET");
conn.setRequestProperty("Authorization", basicAuth);
conn.setRequestProperty("User-Agent", "XXXXXXXXXX/1.0");

BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));

调用BufferedReader的地方是一个IOException异常,表示我从服务器获取了400。由于我收到的是400(而不是与证书相关的异常),因此,我很确定SSL东西可以正常工作。我打开调试信息以查看发送的确切信息,这就是告诉我的信息:

HTTPS GET header

很抱歉,您需要编辑一些信息,但这并不重要。我主要关心的是在请求开始时突出显示的16个字节,并且多余的数据可能就是Jenkins服务器不满意的原因。否则,该请求看上去与wget发送的内容几乎相同,只是wget中的“ Keep-Alive”与Java中的“ keep-alive”不同。我还尝试手动生成请求,以防出现大小写差异,但是我仍然在GET之前得到16字节的前缀。我对请求后的尾随数据也有些好奇,但是我怀疑只要最后有两个CR / LF都没关系。

如果有人对如何解决此问题有任何想法,我将不知所措。谢谢。

2 个答案:

答案 0 :(得分:0)

我可以解决您的“主要问题”,但不能解决您的问题:-(

Padded plaintext before ENCRYPTION强烈建议这是在TLS堆栈中捕获的,因为您可能是javax.net.debug使用Java的。 TLS发送应用程序数据(对于HTTPS是HTTP请求或响应)时,它会根据使用的协议和密码套件添加一些内容。对于TLS 1.1或1.2中的AES(或可能不太常见的山茶SEED或ARIA)CBC密码,它在开头添加16字节IV,在末尾添加HMAC和填充。如果所选的HMAC为SHA384,则双CRLF之后的屏幕快照末尾的数据对于TLS CBC 'GenericBlock' record有效,这可能是因为您没有说明使用了哪个密码套件。

但是,这意味着您实际上在应用程序级别发送的请求看起来是有效的,这对您的400没有帮助。

尽管,您查询部分中的/:,在RFC2396保留集中,并且排除了",这些被假定进行百分比编码。 Web服务器和应用程序在处理此问题的方式上千差万别,我不知道Jenkins是否在乎。

答案 1 :(得分:0)

URL的百分比编码是问题所在。感谢所有回答!