Node.js'te bir SOCKS soketini TLS ile sarmalama
socks paketinin döndürdüğü hedef akışını tls.connect ile sarın ve SNI ile sertifika doğrulaması için sitenin ana makine adını koruyun.
SocksClient.createConnection, istenen hedefe bağlı bir akış döndürür. HTTPS için bu akışın HTTP isteğini taşımadan önce hâlâ bir TLS el sıkışmasına ihtiyacı vardır.
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 proxy listesi proxy ana makinesi ve bağlantı noktası için adaylar sağlar. onTransportError ve onResponseBytes mevcut uygulamaya aittir; ikincisi HTTP yanıt akışını ayrıştırmalıdır. TLS veri parçaları tek başına tam HTTP iletileri değildir.
servername hedefin DNS adıdır. Node'un düşük seviyeli tls.connect'i SNI'yı varsayılan olarak etkinleştirmez ve proxy ana makine adı sitenin sertifika kimliği değildir.
Sertifika doğrulamasını açık tutun. Bağlı soketi vermek, sitenin TLS kimliğini korurken ona ayrı bir doğrudan bağlantı açmayı önler.
SOCKS zaman aşımı bu görüşmeyi sınırlar. Sonraki TLS ve uygulama alışverişi hâlâ çağıranın amaçladığı zaman aşımını, iptali ve temizleme politikasını gerektirir.