2017-01-06 3 views
4

Я столкнулся с любопытным поведением java6/8. Я пытаюсь туннелировать через прокси-сервер, для которого требуется базовая аутентификация пользователя. Выполнение этого стандартного java-аутентификатора. Если я попытаюсь получить доступ к URL-адресу https в качестве первого URL-адреса, выдается исключение:Невозможно туннелировать через прокси. Proxy возвращает «HTTP/1.1 407» через https

java.io.IOException: невозможно туннелировать через прокси. Proxy возвращает «HTTP/1.1 407 Proxy Authentication Required»

Но если я сначала получаю URL-адрес http, а затем URL-адрес https, доступ 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"); 
    } 

Любые предложения, идеи?

ответ

5

Вы должны изменить переменные 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/Библиотека/net.properties

+0

Итак, вы должны сделать это после каждого обновления JDK? – mbee

19

Изменение в Java 8 Update 111:

Теперь прокси, требующие обычной проверки подлинности при настройке туннеля для HTTPS больше не удастся по умолчанию. Если необходимо, эту схему аутентификации можно активировать, удалив Basic из сетевого свойства jdk.http.auth.tunneling.disabledSchemes или по , установив системное свойство с тем же именем в «" (пустое) в командной строке ,

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

Вы можете попробовать запустить Java с

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

или возможно лучше (безопасности): обновить схему аутентификации прокси-сервера, например, для проверки подлинности доступа к дайджесту.

+0

С помощью этой опции работает сейчас, как предлагается. Большое спасибо за этот намек! – PPr