java https httpsurlconnection 代理(proxy)请求时返回407 Proxy Authentication Required

国俊艾
2023-12-01

在java中使用HttpUrlConnection发送请求时,正确配置了代理,当转发http请求时无问题,而转发https请求时,返回了407响应码,而407表示为:Proxy Authentication Required。明确告知没有通过代理服务器身份认证。通过网络抓包可以发现在发送https请求时,网络的请求头里边没有携带身份认证信息。

原因:从jdk8 update 111版本开始,java禁止对 HTTPS 隧道执行“基本”验证

在一些环境中,在执行 HTTPS 代理时某些验证方案可能不是所希望的验证方案。相应地,默认情况下在 Oracle Java 运行时中已停用“基本”验证方案,方法为将 Basic 添加到 jdk.http.auth.tunneling.disabledSchemes 网络属性。现在,在为 HTTPS 设置隧道时,默认情况下需要 Basic 验证的代理将不再成功。如果需要,可以通过从 jdk.http.auth.tunneling.disabledSchemes 网络属性中删除 Basic,或者通过在命令行上将同名的系统属性设置为 ""(空),来重新激活此验证方案。此外,可以使用 jdk.http.auth.tunneling.disabledSchemes 和 jdk.http.auth.proxying.disabledSchemes 网络属性以及同名的系统属性来禁用其他一些验证方案。在为 HTTPS 设置隧道或者执行普通 HTTP 代理时,这些验证方案可能分别处于活动状态。JDK-8160838(非公共)

参考:

JavaTM SE Development Kit 8, Update 111 Release Notes

https://www.java.com/zh_CN/download/faq/release_changes.xml?printFriendly=true

解决办法:

方式一:jdk根目录/jre/lib/net.properties文件中把下面两个值设置为空

jdk.http.auth.tunneling.disabledSchemes=
jdk.http.auth.proxying.disabledSchemes=

方式二:在代码中设置

System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");
System.setProperty("jdk.http.auth.proxying.disabledSchemes", "");

方式三:设置java启动虚拟机参数:

-Djdk.http.auth.tunneling.disabledSchemes= -Djdk.http.auth.proxying.disabledSchemes=

 类似资料: