在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=