Ένα επαναλαμβανόμενο 407 δεν σημαίνει πάντα ότι η Java έστειλε λάθος κωδικό. Η υλοποίηση αναφοράς του JDK συνήθως απενεργοποιεί τον έλεγχο ταυτότητας Basic για σήραγγες HTTPS CONNECT. Ένας proxy που προσφέρει μόνο Basic μπορεί να απορριφθεί πριν η συνάρτηση επανάκλησης ελέγχου ταυτότητας δώσει διαπιστευτήρια.

Περιορίστε το πεδίο εφαρμογής της επανάκλησης διαπιστευτηρίων

Συνδέστε έναν Authenticator με τον πελάτη HTTP της Java και περιορίστε τον στον ρυθμισμένο 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();

Αυτός είναι κώδικας ρύθμισης ενός πελάτη, όχι ένας καθολικός προεπιλεγμένος μηχανισμός ελέγχου ταυτότητας. Αντικαταστήστε τη διεύθυνση τεκμηρίωσης και χρησιμοποιήστε διαπιστευτήρια που έχουν όντως δοθεί για την υπηρεσία. Οι έλεγχοι του τύπου αιτούντος και του τελικού σημείου εμποδίζουν την ίδια επανάκληση να προσφέρει απρόσεκτα τον λογαριασμό του proxy σε πρόκληση ελέγχου ταυτότητας ιστοτόπου.

Ελέγξτε ποιο στάδιο ελέγχου ταυτότητας αποτυγχάνει

Το JDK έχει ξεχωριστές ρυθμίσεις απενεργοποιημένων σχημάτων για τη συνηθισμένη κίνηση HTTP μέσω proxy και για τις σήραγγες CONNECT. Τα σχετικά ονόματα είναι jdk.http.auth.proxying.disabledSchemes και jdk.http.auth.tunneling.disabledSchemes.

Αυτό εξηγεί γιατί ο έλεγχος ταυτότητας της κίνησης HTTP μπορεί να πετυχαίνει, ενώ μια σήραγγα HTTPS μέσω του ίδιου proxy αποτυγχάνει. Ελέγξτε το conf/net.properties του περιβάλλοντος εκτέλεσης και την πολιτική ανάπτυξης, αντί να υποθέτετε ότι άλλος υπολογιστής έχει τις ίδιες ενεργές προεπιλογές.

Το καθολικό άδειασμα μιας λίστας απενεργοποιημένων σχημάτων δεν αποτελεί γενική διόρθωση proxy. Τα διαπιστευτήρια Basic που αποστέλλονται σε μη κρυπτογραφημένο proxy HTTP δεν προστατεύονται από τη μεταγενέστερη σύνδεση TLS με τον προορισμό. Εξετάστε τη μεταφορά του proxy, τη μέθοδο ελέγχου ταυτότητας και την πολιτική ανάπτυξης πριν εγκρίνετε αλλαγή.

Η τεκμηριωμένη συμπεριφορά του ενσωματωμένου ελέγχου ταυτότητας του JDK επίσης δεν υπόσχεται υποστήριξη κάθε σχήματος που διαφημίζει ένας proxy. Μια κεφαλίδα Authorization ή Proxy-Authorization που παρέχεται χειροκίνητα αλλάζει τη ροή του αυτόματου μηχανισμού, επομένως ελέγξτε τις προσαρμοσμένες κεφαλίδες όταν η επανάκληση συμπεριφέρεται διαφορετικά από το παράδειγμα.

Σχετικά άρθρα