Обычная проверка подлинности прокси для URL-адресов HTTPS возвращает HTTP / 1.0 Требуется 407 проверка подлинности прокси

Я хочу использовать прокси-сервер с базовой аутентификацией (имя пользователя, пароль) для соединения (и только это соединение) в Java. Следующий код работает для HTTP-URL (например, "http://www.google.com«):

URL url = new URL("http://www.google.com");
HttpURLConnection httpURLConnection = null;
InetSocketAddress proxyLocation = new InetSocketAddress(proxyHost, proxyPort);
Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyLocation);
httpURLConnection = (HttpURLConnection) url.openConnection(proxy);
// Works for HTTP only! Doesn't work for HTTPS!
String encoded = new sun.misc.BASE64Encoder().encodeBuffer((proxyUserName + ":" + proxyPassword).getBytes()).replace("\r\n", "");
httpURLConnection.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
InputStream is = httpURLConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is); 
int data = isr.read();
while(data != -1){
  char c = (char) data;
  data = isr.read();
  System.out.print(c);
}
isr.close();

Код не работает для URL-адресов HTTPS (например, "https://www.google.comоднако) я получаюjava.io.IOException: Unable to tunnel through proxy. Proxy returns "HTTP/1.0 407 Proxy Authentication Required" когда я пытаюсь получить доступ к URL-адресу HTTPS.

Этот код работает для HTTP и HTTPS:

URL url = new URL("https://www.google.com");
HttpURLConnection httpURLConnection = null;
InetSocketAddress proxyLocation = new InetSocketAddress(proxyHost, proxyPort);
Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyLocation);
httpURLConnection = (HttpURLConnection) url.openConnection(proxy);
// Works for HTTP and HTTPS, but sets a global default!
Authenticator.setDefault(new Authenticator() {
  protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(proxyUserName, proxyPassword.toCharArray());
  }
});
InputStream is = httpURLConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is); 
int data = isr.read();
while(data != -1){
  char c = (char) data;
  data = isr.read();
  System.out.print(c);
}
isr.close();

Проблема со вторым кодом заключается в том, что он устанавливает новое значение по умолчаниюAuthenticator и я не хочу этого делать, потому что этот прокси используется только частью приложения, а другая часть приложения может использовать другой прокси. Я не хочу устанавливать глобальное значение по умолчанию для всего приложения. Есть ли способ получить первый код для работы с HTTPS или способ использоватьAuthenticator без установки его по умолчанию?

Я должен использоватьjava.net.HttpURLConnectionпотому что я переопределяю метод класса, который должен возвращатьHttpURLConnection, поэтому я не могу использовать Apache HttpClient.

Ответы на вопрос(1)

Ваш ответ на вопрос