In SOCKS-socket mei TLS omklaaie yn Node.js
Klaai de bestimmingsstream dy't it socks-pakket weromjout om mei tls.connect en hâld de hostnamme fan de website foar SNI en sertifikaatferifikaasje.
SocksClient.createConnection jout in stream werom dy't ferbûn is mei de oanfrege bestimming. Foar HTTPS hat dy stream noch in TLS-hânskudoek nedich foar't er de HTTP-oanfraach draacht.
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`
);
});
De SOCKS5-proxylist leveret kandidaten foar de proxyhost en -poarte. onTransportError en onResponseBytes hearre by de besteande applikaasje; de lêste moat de HTTP-antwurdstream parse. TLS-datastikken binne net selsstannich folsleine HTTP-berjochten.
De servername is de DNS-namme fan de bestimming. Node syn tls.connect op leech nivo skeakelet SNI net standert yn, en de proxyhostnamme is net de sertifikaatidentiteit fan de website.
Hâld sertifikaatferifikaasje oan. Troch de ferbûne socket te jaan foarkomst in aparte direkte ferbining nei de website, wylst de TLS-identiteit beholden bliuwt.
De SOCKS-timeout beheint dy ûnderhanneling. De lettere TLS- en applikaasje-útwikseling hat noch hieltyd de bedoelde timeout, annulearring en oprommingsbelied fan de oanropper nedich.