Galat Proxy Java 407: Periksa Autentikasi Basic untuk CONNECT
Batasi kredensial proxy Java hanya ke proxy dan periksa kebijakan Basic terpisah milik JDK untuk terowongan HTTPS CONNECT.
407 berulang tidak selalu berarti Java mengirim kata sandi yang salah. Implementasi referensi JDK biasanya menonaktifkan autentikasi Basic untuk terowongan HTTPS CONNECT. Proxy yang hanya menawarkan Basic dapat ditolak sebelum callback autentikasi memberikan kredensial.
Batasi cakupan callback kredensial
Pasang Authenticator pada klien HTTP Java dan batasi ke proxy yang dikonfigurasi:
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();
Ini kode penyiapan klien, bukan autentikator bawaan global. Ganti alamat dokumentasi dan gunakan kredensial yang memang diberikan untuk layanan itu. Pemeriksaan jenis peminta dan endpoint mencegah callback yang sama sembarangan menawarkan akun proxy kepada tantangan autentikasi situs.
Periksa tahap autentikasi yang gagal
JDK memiliki pengaturan skema dinonaktifkan yang terpisah untuk proxy HTTP biasa dan terowongan CONNECT. Namanya jdk.http.auth.proxying.disabledSchemes dan jdk.http.auth.tunneling.disabledSchemes.
Itu menjelaskan mengapa lalu lintas HTTP dapat terautentikasi sementara terowongan HTTPS melalui proxy yang sama gagal. Periksa conf/net.properties milik runtime dan kebijakan penerapan, bukan menganggap mesin lain memiliki nilai bawaan efektif yang sama.
Mengosongkan daftar skema dinonaktifkan secara global bukan perbaikan proxy umum. Kredensial Basic yang dikirim ke proxy HTTP tanpa enkripsi tidak dilindungi koneksi TLS yang kemudian dibentuk ke tujuan. Tinjau transportasi proxy, metode autentikasi, dan kebijakan penerapan sebelum menyetujui perubahan.
Perilaku autentikasi bawaan JDK yang didokumentasikan juga bukan janji mendukung setiap skema yang diiklankan proxy. Header Authorization atau Proxy-Authorization yang diberikan manual mengubah alur autentikator otomatis; periksa header khusus ketika perilaku callback berbeda dari contoh.