Ponavljani 407 ne znači uvijek da je Java poslala pogrešnu lozinku. Referentna implementacija JDK-a obično onemogućuje Basic autentifikaciju za HTTPS CONNECT tunele. Proxy koji nudi samo Basic može biti odbijen prije nego što povratni poziv za autentifikaciju dostavi vjerodajnice.

Ograničite doseg povratnog poziva za vjerodajnice

Pridružite Authenticator Java HTTP klijentu i ograničite ga na podešeni proxy:

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();

Ovo je kod za podešavanje jednog klijenta, a ne globalni zadani autentifikator. Zamijenite dokumentacijsku adresu i koristite vjerodajnice koje su stvarno dodijeljene za tu uslugu. Provjere vrste tražitelja i krajnje točke sprečavaju da isti povratni poziv nepromišljeno ponudi proxy račun na zahtjev web-stranice za autentifikaciju.

Provjerite koja faza autentifikacije ne uspijeva

JDK ima odvojene postavke onemogućenih shema za običan HTTP promet preko proxyja i za CONNECT tunele. Odgovarajući nazivi su jdk.http.auth.proxying.disabledSchemes i jdk.http.auth.tunneling.disabledSchemes.

To objašnjava zašto autentifikacija HTTP prometa može uspjeti dok HTTPS tunel preko istog proxyja ne uspijeva. Provjerite conf/net.properties izvršnog okruženja i politiku postavljanja, umjesto da pretpostavljate iste efektivne zadane vrijednosti na drugom računalu.

Globalno pražnjenje popisa onemogućenih shema nije opće rješenje za proxy. Basic vjerodajnice poslane nešifriranom HTTP proxyju ne štiti kasnija TLS veza s odredištem. Prije odobravanja izmjene razmotrite transport do proxyja, metodu autentifikacije i politiku postavljanja.

Dokumentirano ponašanje ugrađene JDK autentifikacije također ne obećava podršku za svaku shemu koju proxy oglašava. Ručno zadano zaglavlje Authorization ili Proxy-Authorization mijenja tok automatskog autentifikatora, pa provjerite prilagođena zaglavlja kada se povratni poziv ponaša drukčije nego u primjeru.

Povezani članci