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.

Artigos relacionados