Punctul final SOCKS vă duce la site. Partenerul TLS din acea conexiune este site-ul însuși, așa că transmiteți numele de gazdă al destinației fabricii de socket-uri stratificate:

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

Fragmentul presupune importuri standard Java networking și TLS, o configurație de încredere implicită existentă și o conexiune SOCKS care nu necesită acreditări de proxy. Efectuează strângerea de mână; aplicația trebuie încă să trimită o cerere HTTP în formatul așteptat de server. Pentru ținte HTTPS publice pe rute publice permise, lista de proxy-uri SOCKS oferă puncte finale candidate; potriviți versiunea serverului și suportul pentru nume de gazdă la această cale de socket Java.

Citiți cele două identități din exemplu

127.0.0.1:1080 este punctul final al proxy-ului, accesibil din acest proces Java. destination și destinationPort identifică site-ul. createUnresolved păstrează acel nume de gazdă pentru calea SOCKS în loc să îl rezolve imediat pe client.

createSocket stratificat primește identitatea destinației. setEndpointIdentificationAlgorithm("HTTPS") solicită explicit verificările numelui de gazdă. Încrederea în lanțul de certificate al unui SSLSocket brut nu stabilește prin ea însăși că verificarea numelui de gazdă este activată. Înlocuirea numelui proxy-ului sau a loopback-ului pentru a suprima o nepotrivire poate autentifica punctul final greșit.

Păstrați încrederea și curățarea la etapele lor

Fabrica implicită folosește aranjamentul de încredere configurat al JVM-ului. O aplicație cu cerințe private poate folosi în schimb fabrica sa SSLContext inițializată corespunzător. Această alegere este separată de ruta SOCKS; un manager de încredere care acceptă fiecare certificat nu repară un nume de partener greșit.

Un refuz SOCKS are loc înainte de TLS; un certificat neîncrezut sau un nume de gazdă greșit eșuează în timpul TLS; o eroare HTTP poate urma după aceea. Autentificarea la proxy autorizează cererea de tunel, nu autentifică site-ul din interiorul acesteia.

Închiderea socket-ului stratificat cu închiderea automată activată îi închide transportul. Domeniul de resurse exterior închide și el acel transport dacă împachetarea sau strângerea de mână eșuează înainte de finalizarea normală.

Articole similare