Ĉirkaŭvolvi SOCKS-ingon per TLS en Node.js
Ĉirkaŭvolvu la celan fluon redonatan de la pakaĵo socks per tls.connect kaj konservu la gastignomon de la retejo por SNI kaj atestila kontrolo.
SocksClient.createConnection redonas fluon konektitan al la petata celo. Por HTTPS tiu fluo ankoraŭ bezonas TLS-manpremon antaŭ ol porti la HTTP-peton.
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`
);
});
la listo de SOCKS5-prokuroj provizas kandidatojn por la gastiganto kaj haveno de la prokura servilo. onTransportError kaj onResponseBytes apartenas al la ekzistanta aplikaĵo; la dua devas analizi la HTTP-respondan fluon. TLS-datumpecoj estas ne memstare plenaj HTTP-mesaĝoj.
La servername estas la DNS-nomo de la celo. La malaltnivela tls.connect de Node ne ŝaltas SNI defaŭlte, kaj la gastignomo de la prokuro ne estas la atestila identeco de la retejo.
Lasu la atestilan kontrolon ŝaltita. Doni la konektitan ingon evitas malfermi apartan rektan konekton al la retejo dum oni konservas ĝian TLS-identecon.
La SOCKS-tempolimo limigas tiun intertraktadon. La posta TLS- kaj aplikaĵa interŝanĝo ankoraŭ bezonas la intencitan tempolimon, nuligon kaj purigan politikon de la alvokanto.