SocksClient.createConnection mengembalikan aliran yang terhubung ke tujuan yang diminta. Untuk HTTPS, aliran itu masih memerlukan handshake TLS sebelum membawa permintaan HTTP.

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`
  );
});

Daftar proxy SOCKS5 menyediakan kandidat untuk host dan port proxy. onTransportError dan onResponseBytes milik aplikasi yang ada; yang kedua harus mengurai aliran respons HTTP. Potongan data TLS bukan pesan HTTP yang lengkap secara mandiri.

servername adalah nama DNS tujuan. tls.connect tingkat rendah Node tidak mengaktifkan SNI secara default, dan nama host proxy bukan identitas sertifikat situs.

Pertahankan verifikasi sertifikat tetap aktif. Menyediakan socket yang terhubung menghindari membuka koneksi langsung terpisah ke situs sekaligus mempertahankan identitas TLS-nya.

Timeout SOCKS membatasi negosiasi itu. Pertukaran TLS dan aplikasi berikutnya tetap memerlukan timeout, pembatalan, dan kebijakan pembersihan yang dimaksudkan pemanggil.

Artikel terkait