Ошибка прокси 407 в Java: проверьте Basic-аутентификацию для CONNECT
Ограничьте передачу учётных данных Java нужным прокси и проверьте отдельную политику JDK для Basic-аутентификации в туннелях HTTPS CONNECT.
Повторяющийся 407 не всегда означает, что Java отправила неверный пароль. Эталонная реализация JDK обычно отключает Basic-аутентификацию для туннелей HTTPS CONNECT. Прокси, предлагающий только Basic, может быть отклонён ещё до того, как ваш обработчик аутентификации предоставит учётные данные.
Ограничьте область действия обработчика учётных данных
Назначьте Authenticator HTTP-клиенту Java и ограничьте его настроенным прокси:
String proxyHost = "203.0.113.10";
int proxyPort = 8080;
String password = System.getenv("PROXY_PASSWORD");
if (password == null) {
throw new IllegalStateException("Set PROXY_PASSWORD");
}
java.net.Authenticator auth = new java.net.Authenticator() {
@Override
protected java.net.PasswordAuthentication getPasswordAuthentication() {
if (getRequestorType() == RequestorType.PROXY
&& proxyHost.equals(getRequestingHost())
&& proxyPort == getRequestingPort()) {
return new java.net.PasswordAuthentication(
"proxy-user", password.toCharArray());
}
return null;
}
};
java.net.http.HttpClient client = java.net.http.HttpClient.newBuilder()
.proxy(java.net.ProxySelector.of(
new java.net.InetSocketAddress(proxyHost, proxyPort)))
.authenticator(auth)
.connectTimeout(java.time.Duration.ofSeconds(5))
.build();
Это код настройки отдельного клиента, а не глобальный аутентификатор по умолчанию. Замените адрес для документации и используйте учётные данные, действительно выданные для этого сервиса. Проверки типа запрашивающей стороны и конечной точки не дают тому же обработчику необдуманно предложить учётную запись прокси в ответ на запрос аутентификации от сайта.
Проверьте, на каком этапе происходит сбой аутентификации
В JDK раздельно задаются отключённые схемы для обычной передачи HTTP через прокси и для туннелей CONNECT. Соответствующие параметры называются jdk.http.auth.proxying.disabledSchemes и jdk.http.auth.tunneling.disabledSchemes.
Поэтому аутентификация HTTP-трафика может проходить успешно, а туннель HTTPS через тот же прокси — завершаться сбоем. Проверьте conf/net.properties среды выполнения и политику развёртывания, не предполагая, что на другой машине действуют те же значения по умолчанию.
Глобальное обнуление списка отключённых схем — не универсальное исправление прокси. Учётные данные Basic, отправленные незашифрованному HTTP-прокси, не защищены последующим TLS-соединением с целевым сервером. Прежде чем одобрить изменение, оцените транспорт до прокси, метод аутентификации и политику развёртывания.
Документированное поведение встроенной аутентификации JDK также не гарантирует поддержку каждой схемы, заявленной прокси. Вручную заданный заголовок Authorization или Proxy-Authorization меняет ход автоматической аутентификации, поэтому проверьте собственные заголовки, если обработчик ведёт себя иначе, чем в примере.