Le point de terminaison SOCKS vous amène au site. Le pair TLS à l'intérieur de cette connexion est le site lui-même, donc transmettez le nom d'hôte de la destination à la fabrique de sockets superposée :

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.
    }
}

L'extrait suppose les imports Java networking et TLS standard, une configuration de confiance par défaut existante et une connexion SOCKS ne nécessitant aucun identifiant de proxy. Il effectue la poignée de main ; l'application doit encore envoyer une requête HTTP au format attendu par le serveur. Pour des cibles HTTPS publiques sur des routes publiques autorisées, la liste de proxys SOCKS propose des points de terminaison candidats ; alignez la version du serveur et la prise en charge des noms d'hôtes sur ce chemin de socket Java.

Lire les deux identités dans l'exemple

127.0.0.1:1080 est le point de terminaison du proxy, joignable depuis ce processus Java. destination et destinationPort identifient le site. createUnresolved conserve ce nom d'hôte pour le chemin SOCKS au lieu de le résoudre immédiatement côté client.

Le createSocket superposé reçoit l'identité de la destination. setEndpointIdentificationAlgorithm("HTTPS") demande explicitement ses contrôles de nom d'hôte. La confiance dans la chaîne de certificats d'un SSLSocket brut n'établit pas à elle seule que la vérification du nom d'hôte est activée. Remplacer le nom du proxy ou la boucle locale pour supprimer une incohérence peut authentifier le mauvais point de terminaison.

Garder la confiance et le nettoyage avec leurs étapes

La fabrique par défaut utilise la disposition de confiance configurée de la JVM. Une application ayant des exigences privées peut plutôt utiliser sa fabrique SSLContext correctement initialisée. Ce choix est distinct de la route SOCKS ; un gestionnaire de confiance acceptant tous les certificats ne répare pas un nom de pair erroné.

Un rejet SOCKS survient avant TLS ; un certificat non approuvé ou un nom d'hôte erroné échoue pendant TLS ; une erreur HTTP peut suivre ensuite. La connexion au proxy autorise la requête de tunnel plutôt que d'authentifier le site à l'intérieur.

Fermer le socket superposé avec la fermeture automatique activée ferme son transport. La portée de ressource externe ferme aussi ce transport si l'emballage ou la poignée de main échoue avant la fin normale.

Articles similaires