Канчатковая кропка 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. Уваход у проксі аўтарызуе запыт тунеля, а не аўтэнтыфікуе сайт унутры яго.

Закрыццё ўзроўневага сокета з уключаным аўтазакрыццём закрывае яго транспарт. Знешняя вобласць рэсурсу таксама закрывае гэты транспарт, калі абгортка або рукапоціск правальваюцца да нармальнага завяршэння.

Падобныя артыкулы