Node.js တွင် SOCKS socket ကို TLS ဖြင့် ပတ်ခြင်း
socks package မှ ပြန်ပေးသော destination stream ကို tls.connect ဖြင့် ပတ်ပြီး SNI နှင့် လက်မှတ်စစ်ဆေးမှုအတွက် ဝဘ်ဆိုက်၏ hostname ကို ထိန်းသိမ်းပါ။
SocksClient.createConnection သည် တောင်းဆိုထားသော destination နှင့် ချိတ်ဆက်ထားသည့် stream ကို ပြန်ပေးသည်။ HTTPS အတွက် ထို stream သည် HTTP တောင်းဆိုချက်ကို မသယ်ဆောင်မီ TLS handshake လိုအပ်နေသေးသည်။
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 စာရင်း သည် proxy host နှင့် port အတွက် ကိုယ်စားလှယ်လောင်းများ ပေးသည်။ onTransportError နှင့် onResponseBytes သည် ရှိပြီးသား application ၏ အစိတ်အပိုင်းဖြစ်သည်; ဒုတိယတစ်ခုသည် HTTP တုံ့ပြန်မှု stream ကို ခွဲခြမ်းစိတ်ဖြာရမည်။ TLS ဒေတာအပိုင်းအစများသည် သီးခြားအားဖြင့် ပြည့်စုံသော HTTP မက်ဆေ့ချ်များ မဟုတ်ပါ။
servername သည် destination ၏ DNS အမည်ဖြစ်သည်။ Node ၏ အဆင့်နိမ့် tls.connect သည် SNI ကို ပုံသေအားဖြင့် မဖွင့်ထားပြီး proxy hostname သည် ဝဘ်ဆိုက်၏ လက်မှတ်အထောက်အထား မဟုတ်ပါ။
လက်မှတ်စစ်ဆေးမှုကို ဖွင့်ထားပါ။ ချိတ်ဆက်ထားသော socket ကို ပေးအပ်ခြင်းသည် ဝဘ်ဆိုက်သို့ သီးခြား တိုက်ရိုက်ချိတ်ဆက်မှု မဖွင့်ဘဲ ၎င်း၏ TLS အထောက်အထားကို ထိန်းသိမ်းထားသည်။
SOCKS timeout သည် ထို ညှိနှိုင်းမှုကို ကန့်သတ်သည်။ နောက်ပိုင်း TLS နှင့် application ဖလှယ်မှုအတွက် ခေါ်သူ၏ ရည်ရွယ်ထားသော timeout၊ ပယ်ဖျက်မှုနှင့် ရှင်းလင်းရေး မူဝါဒ လိုအပ်နေသေးသည်။