SocksClient.createConnection atgriež straumi, kas savienota ar pieprasīto galamērķi. HTTPS gadījumā šai straumei joprojām ir vajadzīga TLS rokasspiediena procedūra, pirms tā pārsūta HTTP pieprasījumu.

import { SocksClient } from 'socks';
import tls from 'node:tls';

const targetHost = 'service.example';
const info = await SocksClient.createConnection({
  proxy: { host: 'proxy.example', port: 1080, type: 5 },
  command: 'connect',
  destination: { host: targetHost, port: 443 },
  timeout: 10000,
});
const secure = tls.connect({
  socket: info.socket,
  servername: targetHost,
});
secure.on('error', onTransportError);
secure.on('data', onResponseBytes);
secure.once('secureConnect', () => {
  secure.write(
    `GET /data HTTP/1.1\r\nHost: ${targetHost}\r\nConnection: close\r\n\r\n`
  );
});

SOCKS5 starpniekserveru saraksts nodrošina kandidātus starpniekservera resursdatoram un portam. onTransportError un onResponseBytes pieder esošajai programmai; otrajam ir jāanalizē HTTP atbildes straume. TLS datu daļas nav patstāvīgi pilnīgi HTTP ziņojumi.

servername ir galamērķa DNS nosaukums. Node zemā līmeņa tls.connect pēc noklusējuma neieslēdz SNI, un starpniekservera resursdatora nosaukums nav vietnes sertifikāta identitāte.

Atstājiet sertifikāta pārbaudi ieslēgtu. Savienotās ligzdas nodošana izvairās no atsevišķa tieša savienojuma atvēršanas ar vietni, vienlaikus saglabājot tās TLS identitāti.

SOCKS taimauts ierobežo šīs sarunas. Turpmākā TLS un programmas apmaiņa joprojām prasa zvanītāja paredzēto taimautu, atcelšanu un tīrīšanas politiku.

Saistītie raksti