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.

Artikel terkait