无法通过代理进行隧道传输。代理通过 https 返回“HTTP/1.1 407”
Posted
技术标签:
【中文标题】无法通过代理进行隧道传输。代理通过 https 返回“HTTP/1.1 407”【英文标题】:Unable to tunnel through proxy. Proxy returns “HTTP/1.1 407” via https 【发布时间】:2017-05-21 04:30:25 【问题描述】:我遇到了 java6/8 的奇怪行为。 我尝试通过需要基本用户身份验证的代理进行隧道传输。 通过标准的 java Authenticator 执行此操作。 如果我尝试访问 https url 作为第一个 url,则会引发异常:
java.io.IOException:无法通过代理隧道。代理返回“需要 HTTP/1.1 407 代理身份验证”
但是,如果我先访问 http URL,然后访问 https URL,则 https 访问正常。
鉴于该代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import java.net.URL;
public class ProxyPass
public ProxyPass( String proxyHost, int proxyPort, final String userid, final String password, String url )
try
/* Create a HttpURLConnection Object and set the properties */
URL u = new URL( url );
Proxy proxy = new Proxy( Proxy.Type.HTTP, new InetSocketAddress( proxyHost, proxyPort ) );
HttpURLConnection uc = (HttpURLConnection) u.openConnection( proxy );
Authenticator.setDefault( new Authenticator()
@Override
protected PasswordAuthentication getPasswordAuthentication()
if (getRequestorType().equals( RequestorType.PROXY ))
return new PasswordAuthentication( userid, password.toCharArray() );
return super.getPasswordAuthentication();
);
uc.connect();
/* Print the content of the url to the console. */
showContent( uc );
catch (IOException e)
e.printStackTrace();
private void showContent( HttpURLConnection uc ) throws IOException
InputStream i = uc.getInputStream();
char c;
InputStreamReader isr = new InputStreamReader( i );
BufferedReader br = new BufferedReader( isr );
String line;
while ((line = br.readLine()) != null)
System.out.println( line );
public static void main( String[] args )
String proxyhost = "proxyHost";
int proxyport = proxyPort;
final String proxylogin = proxyUser;
final String proxypass = proxyPass;
String url = "http://www.google.de";
String surl = "https://www.google.de";
// new ProxyPass( proxyhost, proxyport, proxylogin, proxypass, url ); // uncomment this line to see that the https request works!
// System.out.println( url + " ...ok" ); // uncomment this line to see that the https request works!
new ProxyPass( proxyhost, proxyport, proxylogin, proxypass, surl );
System.out.println( surl + " ...ok" );
有什么建议、想法吗?
【问题讨论】:
【参考方案1】:Java 8 更新 111 中的更改:
现在,代理在设置隧道时需要基本身份验证 默认情况下,HTTPS 将不再成功。如果需要,这 可以通过从 jdk.http.auth.tunneling.disabledSchemes 网络属性,或通过 在 命令行。
http://www.oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html
您的选择:
通过升级代理的身份验证方案来解决问题(为了安全起见), 例如摘要访问身份验证或者只是通过运行 Java 来解决这个问题
java -Djdk.http.auth.tunneling.disabledSchemes=""
【讨论】:
设置此选项后,现在可以按建议工作。非常感谢这个提示!【参考方案2】:您必须编辑变量 jdk.http.auth.tunneling.disabledSchemes 和 jdk.http.auth.proxying.disabledSchemes 像这样空白:
jdk.http.auth.tunneling.disabledSchemes=
jdk.http.auth.proxying.disabledSchemes=
就我而言,我在这个文件中找到了
jdk1.8.0_111/jre/lib/net.properties
【讨论】:
这有帮助,谢谢。 @Marcus 没有。您可以执行 java -Djdk.http.auth.tunneling.disabledSchemes="" 而不是更新 JDK 属性 @user1697575 这正是我在回答中所建议的。 在 Java 11 上,它位于jdk-11/conf/net.properties
Jdk 1.8.0 的最佳答案.. 其他解决方案均无效【参考方案3】:
这可能会有所帮助:
System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "false");
System.setProperty("jdk.http.auth.proxying.disabledSchemes", "false");
【讨论】:
以上是关于无法通过代理进行隧道传输。代理通过 https 返回“HTTP/1.1 407”的主要内容,如果未能解决你的问题,请参考以下文章
Java Web Start:自 Java 8 Update 111 以来无法通过代理隧道