Erro 407 de proxy no Java: verifique a autenticação Basic para CONNECT
Restrinja as credenciais Java ao proxy e verifique a política separada do JDK para autenticação Basic em túneis HTTPS CONNECT.
Um 407 repetido nem sempre significa que o Java enviou a senha errada. A implementação de referência do JDK normalmente desativa a autenticação Basic para túneis HTTPS CONNECT. Um proxy que oferece apenas Basic pode ser rejeitado antes que o callback de autenticação forneça as credenciais.
Limite o escopo do callback de credenciais
Associe um Authenticator ao cliente HTTP do Java e restrinja-o ao proxy configurado:
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();
Este é um código de configuração de um cliente, não um autenticador padrão global. Substitua o endereço de documentação e use as credenciais realmente fornecidas para esse serviço. As verificações do tipo de solicitante e do endpoint impedem que o mesmo callback ofereça inadvertidamente a conta do proxy em resposta a um desafio de autenticação de um site.
Verifique qual etapa da autenticação está falhando
O JDK tem configurações separadas de esquemas desativados para o tráfego HTTP comum via proxy e para túneis CONNECT. Os nomes relevantes são jdk.http.auth.proxying.disabledSchemes e jdk.http.auth.tunneling.disabledSchemes.
Isso explica por que o tráfego HTTP pode ser autenticado enquanto um túnel HTTPS pelo mesmo proxy falha. Verifique conf/net.properties do ambiente de execução e a política de implantação, em vez de presumir que outra máquina tenha os mesmos valores padrão efetivos.
Esvaziar globalmente uma lista de esquemas desativados não é uma correção geral para proxies. As credenciais Basic enviadas a um proxy HTTP em texto claro não são protegidas pela conexão TLS posterior com o destino. Avalie o transporte do proxy, o método de autenticação e a política de implantação antes de aprovar uma mudança.
O comportamento documentado da autenticação interna do JDK também não promete suporte a todos os esquemas anunciados por um proxy. Um cabeçalho Authorization ou Proxy-Authorization fornecido manualmente altera o fluxo do autenticador automático; por isso, examine os cabeçalhos personalizados quando o callback se comportar de forma diferente do exemplo.