Χρησιμοποιήστε την ταυτότητα του προορισμού για Java TLS μέσω SOCKS
Συνδεθείτε πρώτα μέσω SOCKS και μετά επιστρώστε ένα SSLSocket με το όνομα κεντρικού υπολογιστή του ιστότοπου και ρητούς ελέγχους τελικού σημείου HTTPS.
Το τελικό σημείο SOCKS σάς φέρνει στον ιστότοπο. Ο ομότιμος TLS μέσα σε αυτή τη σύνδεση είναι ο ίδιος ο ιστότοπος, οπότε περάστε το όνομα κεντρικού υπολογιστή του προορισμού στο στρωματοποιημένο εργοστάσιο υποδοχών:
String destination = "example.com";
int destinationPort = 443;
Proxy proxy = new Proxy(
Proxy.Type.SOCKS,
new InetSocketAddress("127.0.0.1", 1080)
);
try (Socket transport = new Socket(proxy)) {
transport.connect(
InetSocketAddress.createUnresolved(destination, destinationPort),
5000
);
SSLSocketFactory factory =
(SSLSocketFactory) SSLSocketFactory.getDefault();
try (SSLSocket tls = (SSLSocket) factory.createSocket(
transport, destination, destinationPort, true)) {
SSLParameters parameters = tls.getSSLParameters();
parameters.setEndpointIdentificationAlgorithm("HTTPS");
tls.setSSLParameters(parameters);
tls.setSoTimeout(15000);
tls.startHandshake();
// Send the application's HTTPS request through tls.
}
}Το απόσπασμα προϋποθέτει τυπικές εισαγωγές Java networking και TLS, υπάρχουσα προεπιλεγμένη διαμόρφωση εμπιστοσύνης και σύνδεση SOCKS που δεν χρειάζεται διαπιστευτήρια διακομιστή μεσολάβησης. Εκτελεί τη χειραψία· η εφαρμογή πρέπει ακόμη να στείλει αίτημα HTTP με τη μορφή που αναμένει ο διακομιστής. Για δημόσιους στόχους HTTPS σε επιτρεπόμενες δημόσιες διαδρομές, η λίστα διακομιστών μεσολάβησης SOCKS προσφέρει υποψήφια τελικά σημεία· αντιστοιχίστε την έκδοση του διακομιστή και την υποστήριξη ονομάτων κεντρικού υπολογιστή με αυτή τη διαδρομή υποδοχής Java.
Διαβάστε τις δύο ταυτότητες στο παράδειγμα
Το 127.0.0.1:1080 είναι το τελικό σημείο του διακομιστή μεσολάβησης, προσβάσιμο από αυτή τη διεργασία Java. Τα destination και destinationPort προσδιορίζουν τον ιστότοπο. Το createUnresolved διατηρεί αυτό το όνομα κεντρικού υπολογιστή για τη διαδρομή SOCKS αντί να το επιλύει πρόωρα στον πελάτη.
Το στρωματοποιημένο createSocket λαμβάνει την ταυτότητα του προορισμού. Το setEndpointIdentificationAlgorithm("HTTPS") ζητά ρητά τους ελέγχους ονόματος κεντρικού υπολογιστή του. Η εμπιστοσύνη αλυσίδας πιστοποιητικών ενός ακατέργαστου SSLSocket δεν αποδεικνύει από μόνη της ότι η επαλήθευση ονόματος κεντρικού υπολογιστή είναι ενεργοποιημένη. Η αντικατάσταση του ονόματος του διακομιστή μεσολάβησης ή του loopback για την καταστολή αναντιστοιχίας μπορεί να πιστοποιήσει λάθος τελικό σημείο.
Κρατήστε την εμπιστοσύνη και τον καθαρισμό στα στάδιά τους
Το προεπιλεγμένο εργοστάσιο χρησιμοποιεί τη διαμορφωμένη ρύθμιση εμπιστοσύνης της JVM. Μια εφαρμογή με ιδιωτικές απαιτήσεις μπορεί αντ' αυτού να χρησιμοποιήσει το κατάλληλα αρχικοποιημένο εργοστάσιο SSLContext. Αυτή η επιλογή είναι ξεχωριστή από τη διαδρομή SOCKS· ένας διαχειριστής εμπιστοσύνης που δέχεται κάθε πιστοποιητικό δεν διορθώνει λάθος όνομα ομοτίμου.
Μια απόρριψη SOCKS συμβαίνει πριν από το TLS· ένα μη αξιόπιστο πιστοποιητικό ή λάθος όνομα κεντρικού υπολογιστή αποτυγχάνει κατά τη διάρκεια του TLS· ένα σφάλμα HTTP μπορεί να ακολουθήσει μετά. Η σύνδεση στον διακομιστή μεσολάβησης εξουσιοδοτεί το αίτημα σήραγγας και δεν πιστοποιεί τον ιστότοπο μέσα σε αυτήν.
Το κλείσιμο της στρωματοποιημένης υποδοχής με ενεργό το αυτόματο κλείσιμο κλείνει τη μεταφορά της. Το εξωτερικό πεδίο πόρων κλείνει επίσης αυτή τη μεταφορά αν η περιτύλιξη ή η χειραψία αποτύχουν πριν από την κανονική ολοκλήρωση.