【问题标题】:Extra data in HTTPS GET request when using HttpsURLConnection?使用 HttpsURLConnection 时 HTTPS GET 请求中的额外数据?
【发布时间】:2018-08-10 16:29:29
【问题描述】:

上下文:尝试通过 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 就没有关系了。

如果有人对如何解决此问题有任何想法,我会全力以赴。谢谢。

【问题讨论】:

  • 尝试使用 wget 或 Python 打开调试信息以查看它们发送的标头。
  • 谢谢 - 我已经让 wget 转储请求的标头/正文数据。我会使用 Wireshark,但无法访问直接解码数据包的密钥。

标签: java jenkins httpsurlconnection


【解决方案1】:

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

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

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

虽然,您查询部分中的 /:, 位于 RFC2396 保留集中,而 " 被排除在外,假定要进行百分比编码。网络服务器和应用程序在处理这个问题上的差异很大,我不知道 Jenkins 是否在乎。

【讨论】:

  • 关注javax.net.debug 观察。 ;-) 感谢您提供信息,路径的百分比编码是我将要查看的内容。这很可能是问题所在。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2010-12-02
    • 2018-03-25
    相关资源
    最近更新 更多