Errores 407 de proxy en Java: comprueba Basic para CONNECT
Limita las credenciales del proxy Java al proxy y revisa la política Basic independiente del JDK para los túneles HTTPS CONNECT.
Un 407 repetido no siempre significa que Java envió una contraseña incorrecta. La implementación de referencia del JDK normalmente desactiva la autenticación Basic para túneles HTTPS CONNECT. Un proxy que solo ofrece Basic puede rechazarse antes de que el callback de autenticación proporcione credenciales.
Limita el alcance del callback de credenciales
Asocia un Authenticator al cliente HTTP de Java y limítalo al 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 código configura un cliente, no un autenticador global predeterminado. Sustituye la dirección de documentación y usa credenciales realmente proporcionadas para ese servicio. Las comprobaciones del tipo de solicitante y del punto de conexión evitan que el mismo callback ofrezca sin más la cuenta del proxy ante una petición de autenticación de un sitio web.
Comprueba qué etapa de autenticación falla
El JDK tiene ajustes de esquemas desactivados separados para el proxy HTTP normal y los túneles CONNECT. Sus nombres son jdk.http.auth.proxying.disabledSchemes y jdk.http.auth.tunneling.disabledSchemes.
Esto explica que el tráfico HTTP pueda autenticarse mientras falla un túnel HTTPS por el mismo proxy. Revisa conf/net.properties del entorno de ejecución y la política de despliegue en vez de suponer que otro equipo tiene los mismos valores efectivos predeterminados.
Vaciar globalmente una lista de esquemas desactivados no es una reparación general de proxies. Las credenciales Basic enviadas a un proxy HTTP en texto claro no quedan protegidas por la conexión TLS posterior con el destino. Revisa el transporte del proxy, el método de autenticación y la política de despliegue antes de aprobar un cambio.
El comportamiento de autenticación integrado documentado por el JDK tampoco promete admitir todos los esquemas anunciados por un proxy. Una cabecera Authorization o Proxy-Authorization añadida manualmente cambia el flujo del autenticador automático; revisa las cabeceras personalizadas si el callback se comporta de forma distinta al ejemplo.