Wikkel 'n SOCKS-sok met TLS in Node.js
Wikkel die bestemmingsstroom wat die socks-pakket teruggee met tls.connect en behou die webwerf se gasheernaam vir SNI en sertifikaatverifikasie.
SocksClient.createConnection gee 'n stroom terug wat aan die versoekte bestemming gekoppel is. Vir HTTPS moet daardie stroom nog 'n TLS-handskud doen voordat dit die HTTP-versoek dra.
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`
);
});
Die SOCKS5-volmaglys lewer kandidate vir die volmag-gasheer en -poort. onTransportError en onResponseBytes behoort aan die bestaande toepassing; laasgenoemde moet die HTTP-antwoordstroom ontleed. TLS-datastukkies is nie onafhanklik volledige HTTP-boodskappe nie.
Die servername is die bestemming se DNS-naam. Node se laevlak-tls.connect aktiveer nie SNI by verstek nie, en die volmag-gasheernaam is nie die webwerf se sertifikaatidentiteit nie.
Hou sertifikaatverifikasie aan. Deur die gekoppelde soket te verskaf, vermy jy 'n aparte direkte verbinding na die webwerf terwyl die TLS-identiteit behou word.
Die SOCKS-tydsperking begrens daardie onderhandeling. Die latere TLS- en toepassingsuitruiling het steeds die caller se beoogde tydsperking, kansellasie en opruimingsbeleid nodig.