SOCKS jungties apvyniojimas TLS Node.js aplinkoje
Apvyniokite paskirties srautą, kurį grąžina socks paketas, naudodami tls.connect ir išsaugokite svetainės pagrindinio kompiuterio vardą SNI ir sertifikato patikrai.
SocksClient.createConnection grąžina srautą, prijungtą prie prašomos paskirties. HTTPS atveju tam srautui vis dar reikia TLS rankos paspaudimo, kol jis perduos HTTP užklausą.
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 tarpinių serverių sąrašas pateikia kandidatus tarpinio serverio pagrindiniam kompiuteriui ir prievadui. onTransportError ir onResponseBytes priklauso esamai programai; antrasis turi išanalizuoti HTTP atsakymo srautą. TLS duomenų fragmentai nėra savarankiškai pilni HTTP pranešimai.
servername yra paskirties DNS vardas. Node žemo lygio tls.connect pagal nutylėjimą neįjungia SNI, o tarpinio serverio pagrindinio kompiuterio vardas nėra svetainės sertifikato tapatybė.
Palikite sertifikato patikrą įjungtą. Prijungtos jungties pateikimas išvengia atskiro tiesioginio ryšio su svetaine atidarymo ir išsaugo jos TLS tapatybę.
SOCKS skirtasis laikas riboja tas derybas. Vėlesni TLS ir programos mainai vis dar reikalauja kviečiančiojo numatyto skirtojo laiko, atšaukimo ir valymo politikos.