Usa l'identità della destinazione per Java TLS su SOCKS
Connettiti prima tramite SOCKS, poi sovrapponi un SSLSocket con il nome host del sito e controlli espliciti dell'endpoint HTTPS.
L'endpoint SOCKS ti porta al sito. Il peer TLS dentro quella connessione è il sito stesso, quindi passa il nome host della destinazione alla factory di socket sovrapposta:
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.
}
}Il frammento presuppone import Java networking e TLS standard, una configurazione di trust predefinita esistente e una connessione SOCKS che non richiede credenziali proxy. Esegue l'handshake; l'applicazione deve comunque inviare una richiesta HTTP nel formato atteso dal server. Per destinazioni HTTPS pubbliche su percorsi pubblici consentiti, la lista di proxy SOCKS offre endpoint candidati; allinea la versione del server e il supporto dei nomi host a questo percorso socket Java.
Leggi le due identità nell'esempio
127.0.0.1:1080 è l'endpoint del proxy, raggiungibile da questo processo Java. destination e destinationPort identificano il sito. createUnresolved conserva quel nome host per il percorso SOCKS invece di risolverlo in anticipo sul client.
Il createSocket sovrapposto riceve l'identità della destinazione. setEndpointIdentificationAlgorithm("HTTPS") richiede esplicitamente i suoi controlli sul nome host. La fiducia nella catena di certificati di un SSLSocket grezzo non stabilisce da sola che la verifica del nome host sia abilitata. Sostituire il nome del proxy o il loopback per sopprimere una discrepanza può autenticare l'endpoint sbagliato.
Mantieni fiducia e pulizia con le loro fasi
La factory predefinita usa la disposizione di fiducia configurata della JVM. Un'applicazione con requisiti privati può invece usare la propria factory SSLContext inizializzata correttamente. Questa scelta è separata dal percorso SOCKS; un gestore di fiducia che accetta ogni certificato non ripara un nome di peer errato.
Un rifiuto SOCKS avviene prima di TLS; un certificato non attendibile o un nome host errato fallisce durante TLS; in seguito può verificarsi un errore HTTP. L'accesso al proxy autorizza la richiesta del tunnel anziché autenticare il sito al suo interno.
Chiudere il socket sovrapposto con la chiusura automatica abilitata chiude il suo trasporto. L'ambito di risorsa esterno chiude anch'esso quel trasporto se l'involucro o l'handshake falliscono prima del completamento normale.