无法通过代理隧道。 代理通过https返回“HTTP / 1.1 407”

我面临着java6 / 8的奇怪行为。 我尝试隧道通过需要基本用户身份validation的代理。 通过标准的java Authenticator执行此操作。 如果我尝试访问https url作为第一个url,则抛出exception:

java.io.IOException:无法通过代理进行隧道传输。 代理返回“需要HTTP / 1.1 407代理身份validation”

但是,如果我首先访问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" ); } 

有什么建议,想法吗?

您必须将变量jdk.http.auth.tunneling.disabledSchemesjdk.http.auth.proxying.disabledSchemes编辑为空白,如下所示:

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

就我而言,我在这个文件中找到了

jdk1.8.0_111 / JRE / LIB / net.properties

Java 8 Update 111中的更改​​:

现在,默认情况下,在为HTTPS设置隧道时需要基本身份validation的代理将不再成功。 如果需要,可以通过从jdk.http.auth.tunneling.disabledSchemes网络属性中删除Basic,或通过在命令行上将同名的系统属性设置为“”(空)来重新激活此身份validation方案。

http://www.oracle.com/technetwork/java/javase/8u111-relnotes-3124969.html

你的选择:

  • 通过升级代理的身份validation方案(例如摘要访问身份validation)来解决问题(为了安全起见)
  • 或者通过运行Java来解决问题

     java -Djdk.http.auth.tunneling.disabledSchemes=""