NodeJs ile Socks Proxy Üzerinden Http istekleri
Önce ağ bilgilerini görelim ki nereye vekil sunucu kuruyor, hangi sanal makineden hangi http[s/2] sunucularına istek yaptığımızı görelim.
Kodlarım şurada: https://github.com/cemtopkaya/nodejs-http-2-s-over-proxy
Windows 11 içinde WSL olarak Ubuntu koşturuyorum.
Windows 11:
WSL makinelerinin ev sahibi bilgisayarla iletişimini sağlyacak sanal switch (anahtar)’in win11 içindeki durumu:
vEthernet (WSL (Hyper-V firewall))
, adından da anlaşılacağı gibi, Hyper-V'nin sağladığı bir güvenlik duvarı yapılandırması sağlayan sanal Ethernet adaptörüdür. WSL2, Linux çekirdeğini Hyper-V sanallaştırma teknolojisi ile çalıştırır. Hyper-V sanal makineleri gibi WSL 2 instance'ları da sanal ağ adaptörleriyle instance’larının ağ trafiğini yönetmek ve WSL 2'nin internete veya yerel ağa erişimini sağlamaktır.WSL içinden ağ ayarlarımıza bakalım:
cemt@PC-CEM-TOPKAYA:~$ ip -br -c a
lo UNKNOWN 127.0.0.1/8 ::1/128
eth0 UP 192.168.188.36/20 fe80::215:5dff:feb9:4d52/64
docker0 DOWN 172.17.0.1/16 2001:db8:1::1/64 fe80::42:5ff:fef5:73c4/64 fe80::1/64
eth0
Sanal linux makinemdeki sanal ağ kartım ve adresi: 192.168.188.36
cemt@PC-CEM-TOPKAYA:~$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.176.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.176.0 0.0.0.0 255.255.240.0 U 0 0 0 eth0
Özellikle IP bloğu verilmemiş adreslere (internete — 0.0.0.0
) doğru yaptığım istekler eth0
kartının üzerinden 192.168.176.1
ağ geçidine yönlendirileceğini rotalarda görüyoruz.
Bir istek yapalım ve sanal makinenin varsayılan ağ geçidinden (192.168.176.1
) ev sahibi makinem olan windows 11'in sanal ağ adaptörüne gelecek. Oradan windows 11'in ağ geçidi olan modemime (192.168.1.1
) ve internete olacak.
cemt@PC-CEM-TOPKAYA:~$ traceroute google.com
traceroute to google.com (172.217.17.110), 30 hops max, 60 byte packets
1 192.168.176.1 (192.168.176.1) 0.332 ms 0.303 ms 0.295 ms
2 192.168.1.1 (192.168.1.1) 2.062 ms 5.310 ms 3.981 ms
3 100.123.128.1 (100.123.128.1) 7.773 ms 8.163 ms 8.555 ms
4 .... kalanı gereksiz ip adresleri
Önce basit bir nodejs http istemcisi görelim. Bu sadece bize bir isteğin iskeletini çıkarmak için fikir versin.
NodeJS İle Basit Http İstemci
// http_client.js
// 1. HTTP ve URL Modüllerini İçe Aktarma
// HTTP ve URL işlemleri için gerekli olan modülleri içe aktarır.
import http from 'http'; // HTTP modülü
import url from 'url'; // URL modülü
// 2. Hedef URL Tanımlama (İstek yapılacak hedef URL'yi tanımlar.)
const targetUrl = 'http://example.com:80';
// 3. URL'yi Ayrıştırma
// Hedef URL'yi ayrıştırarak parçalarına böler (hostname, path, port, vb.).
const urlParts = url.parse(targetUrl);
// 4. İstek Seçeneklerini Tanımlama
// HTTP isteği için gerekli seçenekleri (hostname, path, port, method) belirler.
const options = {
hostname: urlParts.hostname, // Hedef sunucu adı
path: urlParts.path, // Hedef yol
port: urlParts.port, // Hedef port (80)
method: 'GET', // İstek yöntemi (GET)
};
// 5. HTTP İsteği Oluşturma
// HTTP isteği oluşturur ve yanıtı işlemek için bir geri çağırma fonksiyonu tanımlar.
const req = http.request(options, (res) => {
// 6. Yanıt Durum Kodunu Yazdırma
// Sunucudan gelen yanıtın durum kodunu konsola yazdırır.
console.log(`Yanıt Durumu Kodu: ${res.statusCode}`);
// 7. Yanıt Başlıklarını Yazdırma
// Sunucudan gelen yanıt başlıklarını konsola yazdırır.
console.log('Başlıklar:');
const headers = res.headers;
for (const key in headers) {
console.log(`${key}: ${headers[key]}`);
}
// 8. Yanıt Verilerini Alma ve Yazdırma
// Yanıt verilerini parça parça alır ve konsola yazdırır.
res.on('data', (chunk) => {
console.log(chunk.toString());
});
// 9. Yanıt Hatalarını Ele Alma
// Yanıt sırasında oluşabilecek hataları ele alır ve konsola yazdırır.
res.on('error', (err) => {
console.error('Hata:', err);
});
// 10. Yanıt Tamamlandığında Mesaj Yazdırma
res.on('end', () => {
console.log('Yanıt Alındı.');
});
});
// 11. İstek Hatalarını Ele Alma
// İstek sırasında oluşabilecek hataları ele alır ve konsola yazdırır.
req.on('error', (err) => {
console.error('İstek Sırasında Hata:', err);
});
// 12. İsteği Gönderme
// HTTP isteğini gönderir.
req.end();
+-------------------------------------------------------------------------------------+
| HTTP ve URL Modüllerini İçe Aktarma |
+-------------------------------------------------------------------------------------+
| +-------------------------------------------------------------------+ |
| | Hedef URL Tanımlama | |
| | +---------------------------------------------------------------+ | |
| | | URL'yi Ayrıştırma | | |
| | | +---------------------------------------------------------+ | | |
| | | | İstek Seçeneklerini Tanımlama | | | |
| | | | +---------------------------------------------------+ | | | |
| | | | | HTTP İsteği Oluşturma | | | | |
| | | | | +---------------------------------------------+ | | | | |
| | | | | | Yanıt Durum Kodunu Yazdırma | | | | | |
| | | | | | +---------------------------------------+ | | | | | |
| | | | | | | Yanıt Başlıklarını Yazdırma | | | | | | |
| | | | | | | +---------------------------------+ | | | | | | |
| | | | | | | | Yanıt Verilerini Al ve Yazdır | | | | | | |
| | | | | | | | +-----------------------------+ | | | | | | |
| | | | | | | | | Yanıt Hatalarını Ele Alma | | | | | | | |
| | | | | | | | +-----------------------------+ | | | | | |
whistle İle Yerel Proxy
Tüm kodu buraya yazayım sonra parça parça anlatacağım:
$ sudo su
$ npm install -g whistle
$ w2 start -H 192.168.188.36 --uiport 891 --httpPort 777 --httpsPort 888 --socksPort 999
$ curl -x http://192.168.188.36:8899 -L http://example.com
- whistle Kuracağız
- whistle Vekil sunucuyu ayaklandıracağız
- curl İle whistle üzerinden http isteği yapacağız
Kurulum sonrasında yetkili bir kullanıcıyla çalıştırılacağı için sudo su
ile kök kullanıcı olarak kurulumu yapın derim:
npm install -g whistle
Çalıştırmayı ister terminal ekranında günlük kayıtlarını takip edebilmek için w2 run
ile isterseni arka planda çalışması için w2 start
ile başlatabilirsiniz. Yardım için w2 --help
!
-H 192.168.188.36
ile WSL olarak Windows içinde koşturduğum Ubuntu 22.04'ün IP adresini verdim. Yoksa any IP address
diye tanımlı olan 0.0.0.0
adresinde koşacaktı
--ui-port 891
ile Web GUI ayaklandırın ki isteklerinizi internet gezgininde görebilesiniz,
--httpPort 777
ile http
isteklerini karşılayacak proxy hizmetinin 777 portunda çalışacağını,
--httpsPort 888
ile https
isteklerini karşılayacak proxy hizmetinin 888 portunda çalışacağını,
--socksPort 999
ile socks
protokolünde çalışacak vekil sunucu hizmetinin 999 portunda çalışacağını belirlemiş olursunuz
w2 start -H 192.168.188.36 --uiport 891 --httpPort 777 --httpsPort 888 --socksPort 999
Şimdi bir curl isteği atarak web arayüzünde isteğimizi görelim:
$ curl -x http://192.168.188.36:777 -L http://example.com
https İstekleri İçin Sertifika Ayarları
Ubuntu’da trust uygulaması olmadığı için yükledim sudo apt install p11-kit
ve indirdiğim rootCA.crt
dosyasını güvenilir sertifikaların arasına kattım (echo “rootCA.crt” >> /etc/ca-certificates.conf)
sertifikaları güncelledim (update-ca-certificates
) ve eklendiğini trust list | grep -i whistle
komutuyla gördüm:
Karekod resimdeki açık iletişim kutusunda bir onay kutusu bulunur: Capture HTTPS CONNECTS
.: HTTPS müdahale işlevini açın. Yalnızca bu onay kutusunu işaretleyerek ve kök sertifikayı yükleyerek Whistle, HTTPS ve Websocket isteklerini görebilir.
socks Vekil Sunucu Kullanımı
Bilgisayarımızdan bir sunucuya tüm TCP isteklerini akıtmak için tünel açarız. Aşağıdaki örnekte 192.168.188.36
adresimizin 6000
portumuza gelen tüm istekleri uzak sunucu adresine yönlendireceğimizi -D
anahtarıyla belirtiyoruz. Ve bu tünele curl
isteklerini bu bağlantıdan faydalanarak akıtabiliriz:
$ ssh -D 192.168.188.36:6000 uzakSunucudakiKullaniciAdi@uzakSunucununIPAdresi
$ curl -x socks5://192.168.188.36:6000 https://www.turkiye.gov.tr/ -vvv
Kural Ekleyerek Trafiği Yönlendirmek
Bu konuda epeyce yapılabilecekler var ancak ben belirli bir adrese gelen istekleri socks vekil sunucu olarak açtığım ssh tüneline yönlendirmeyi göstereceğim.
Önce ssh komutuyla tünelimizi açalım (-vvv
anahtarıyla tüneldeki akışları konsolda görelim ve -N
anahtarıyla ssh komutunun terminali bırakmamasını sağlıyorum -sanırım-) :
$ sshpass -p sifre123 ssh -D 192.168.188.36:6000 ubuntu@192.168.13.71 -vvv -N
Sonra whistle vekil sunucumuzu çalıştıralım:
$ w2 run -H 192.168.188.36 --uiport 891 --httpPort 777
Sonra whistle WEB GUI üzerinde turkiye.gov.tr adresine gelen istekleri az önce açtığımız ssh tüneline yönlendirme kuralını girelim:
Sonra curl isteğimizi aşağıdaki gibi çalıştıralım:
$ curl --proxy http://192.168.188.36:777 https://turkiye.gov.tr
Whistle GUI üzerinde isteğimizin ssh tüneline gittiğini görebiliyoruz:
Şimdi kuralımızın dışındaki bir adrese istek yapalım $ curl — proxy http://192.168.188.36:777 https://example.com
ve
- SSH tünelinde bir hareket olmadığını boşluk satırlarının bıraktığımız gibi kaldığını görerek,
- WEB GUI’de cevabın 6000 portundan gelmediğini görerek
ispat edelim:
443 Portundan cevabın geldiğini ve hatta SOCKS üzerine yönlendirdiğimiz önceki isteğin lacivert bir metin rengiyle yazdırıldığını da görebilirsiniz:
NodeJS ile Basit HTTPs İstemcisi
Aşağıdaki nodejs kodu ile https paketini kullanarak turkiye.gov.tr adresine istek yapıyoruz.
//calisan/nodejs-https.js
import https from 'https'; // HTTPS modülü
import url from 'url'; // URL modülü
// Hedef URL
const targetUrl = 'https://turkiye.gov.tr';
// URL'yi ayrıştırma
const urlParts = url.parse(targetUrl);
// İstek seçenekleri
const options = {
hostname: urlParts.hostname,
path: urlParts.path,
port: urlParts.port || 443, // HTTPS varsayılan olarak 443 portu kullanır
method: 'GET', // İstek yöntemi (GET, POST, vb.)
};
// HTTPS istek oluşturma
const req = https.request(options, (res) => {
// Yanıt durumu kodunu yazdırma
console.log(`Yanıt Durumu Kodu: ${res.statusCode}`);
// Başlıkları yazdırma
console.log('Başlıklar:');
for (const key in res.headers) {
console.log(`${key}: ${headers[key]}`);
}
// Çıktı akışı (stream) zaten mevcuttur, direkt olarak okuma yapabilirsiniz
res.on('data', (chunk) => {
console.log(chunk.toString());
});
// Hata durumlarını ele alma
res.on('error', (err) => {
console.error('Hata:', err);
});
// Çıktı akışı tamamlandığında mesaj yazdırma
res.on('end', () => {
console.log('Yanıt Alma İşlemi Tamamlandı.');
});
});
// Hata durumlarını ele alma
req.on('error', (err) => {
console.error('İstek Sırasında Hata:', err);
});
// İsteği gönderme
req.end();
Bu isteğin whistle vekil sunucusuna düştüğünü bir sonraki örnekte göreceğiz.
NodeJS ile HTTPs İstemcisi ve Vekil Sunucu Ayarları
Whistle vekil sunucusunu ayaklandıralım:
$ w2 run -H 192.168.188.36 \
--uiport 891 \
--httpsPort 888
https Vekil sunucusuna erişmesi için kodu elden geçiriyoruz
// https_client-over-https_proxy.js
import https from 'https'; // HTTPS modülü
import url from 'url'; // URL modülü
import { HttpProxyAgent } from 'http-proxy-agent';
// Proxy sunucu bilgileri
const PROXY_HOST = '192.168.188.36'; // Proxy sunucu adresi veya IP adresi
const PROXY_PORT = 888; // HTTPS Proxy sunucu portu
const PROXY_PROTOCOL = 'https:'; // HTTPS protokolü
// Proxy ayarları
const proxyOptions = {
hostname: PROXY_HOST, // Proxy'nin IP adresi
port: PROXY_PORT, // Proxy'nin port numarası
protocol: PROXY_PROTOCOL, // Proxy'nin protokolü (http veya https)
};
// Proxy için HttpProxyAgent oluştur
const proxyAgent = new HttpProxyAgent(proxyOptions);
// Hedef URL
const targetUrl = 'https://example.com';
// URL'yi ayrıştırma
const urlParts = url.parse(targetUrl);
// HTTPS istek seçenekleri
const options = {
hostname: urlParts.hostname,
path: urlParts.path,
port: urlParts.port || 443, // HTTPS varsayılan olarak 443 portu kullanır
method: 'GET', // İstek yöntemi (GET, POST, vb.)
agent: proxyAgent, // Proxy ajanı ekleme
};
// Güvenlik nedeniyle yapılan sertifika doğrulamasını ihmal ediyoruz
process.env["NODE_TLS_REJECT_UNAUTHORIZED"]=0
// HTTPS istek oluşturma
const req = https.request(options, (res) => {
// Yanıt durumu kodunu yazdırma
console.log(`Yanıt Durumu Kodu: ${res.statusCode}`);
// Başlıkları yazdırma
console.log('Başlıklar:');
const headers = res.headers;
for (const key in headers) {
console.log(`${key}: ${headers[key]}`);
}
// Veriyi parça parça aldıkça yazacağız
res.on('data', (chunk) => {
console.log(chunk.toString());
});
// Hata durumlarını ele alma
res.on('error', (err) => {
console.error('Hata:', err);
});
// Çıktı akışı tamamlandığında mesaj yazdırma
res.on('end', () => {
console.log('Yanıt Alındı.');
});
});
// Hata durumlarını ele alma
req.on('error', (err) => {
console.error('İstek Sırasında Hata:', err);
});
// İsteği gönderme
req.end();
Aynı isteği vekil sunucu üzerinde example.com adresine gelen istekler için socks vekil sunucusuna yönlendirerek tekrar deneyeceğiz
NodeJS İle Basit Http2 İstemci
// nodejs-http2-client.js
import http2 from 'http2';
(async () => {
try {
// Bir tünel için HTTP/1.1 CONNECT isteği oluştur:
const client = http2.connect('http://192.168.13.71:8207');
client
.on('error', (err) => console.error(err))
.on('connect', (res, socket) => { console.error(res) });
/* İstemciyi kullan */
const postbody = 'afId=Netflix&grant_type=client_credentials&scope=3gpp-monitoring-event';
const headers = {
':method': 'POST',
':path': '/oauth2/token',
'content-type': 'application/x-www-form-urlencoded',
'content-length': Buffer.byteLength(postbody),
};
/* İstek yap */
const req = client.request(headers);
req
.on('error', (err) => {
console.error('HTTP/2 isteği hatası:', err);
})
.on('response', (headers, flags) => {
console.log('HTTP/2 yanıt başlıkları:', headers);
})
.on('data', (chunk) => {
console.log('HTTP/2 yanıt parçası:', chunk);
})
.on('end', () => {
client.close();
});
req.setEncoding('utf8');
req.write(postbody);
req.end();
} catch (error) {
console.error(error);
}
})();
// package.json
{
"name": "http2-client",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
},
"type": "module"
}
Çıktısı:
cemt@PC-CEM-TOPKAYA:~/_HTTP2/http2-client$ node nodejs-http2-client.js
Http2Session {
type: 1,
closed: false,
destroyed: false,
state: {
effectiveLocalWindowSize: 65535,
effectiveRecvDataLength: 0,
nextStreamID: 1,
localWindowSize: 65535,
lastProcStreamID: 0,
remoteWindowSize: 65535,
outboundQueueSize: 1,
deflateDynamicTableSize: 0,
inflateDynamicTableSize: 0
},
localSettings: {
headerTableSize: 4096,
enablePush: true,
initialWindowSize: 65535,
maxFrameSize: 16384,
maxConcurrentStreams: 4294967295,
maxHeaderListSize: 4294967295,
maxHeaderSize: 4294967295,
enableConnectProtocol: false
},
remoteSettings: {
headerTableSize: 4096,
enablePush: true,
initialWindowSize: 65535,
maxFrameSize: 16384,
maxConcurrentStreams: 100,
maxHeaderListSize: 4294967295,
maxHeaderSize: 4294967295,
enableConnectProtocol: false
}
}
HTTP/2 yanıt başlıkları: [Object: null prototype] {
':status': 200,
date: 'Tue, 14 May 2024 10:51:28 GMT',
'cache-control': '',
'content-type': 'application/json',
pragma: '',
[Symbol(nodejs.http2.sensitiveHeaders)]: []
}
HTTP/2 yanıt parçası: {"access_token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJkN2QyZTM2Yi1kYmU1LTRmNzktYmJjZC1jMTVmZjIxMzdiY2IiLCJjb25zdW1lclBsbW5JZCI6Int9IiwiZXhwIjoxNzE1NjkzODg4LCJpc3MiOiJkN2QyZTM2Yi1kYmU1LTRmNzktYmJjZC1jMTVmZjIxMzdiY2IiLCJwcm9kdWNlclBsbW5JZCI6Int9Iiwic2NvcGUiOiIzZ3BwLW1vbml0b3JpbmctZXZlbnQiLCJzdWIiOiJOZXRmbGl4In0.rCFIipgA36URqJYwbjRTj6FZDQBH5yg_s7uiyheJd4fGpcAGtAo_74X6LtXr2C8wJgvLc60gj5Y6LKoLRnuDjTZPlSlwmiadTn9zbBKSZwTZ3ZPX6IERIr05-N8qI_Sp7R1YFptpqwZgBH_wy86fam77MhV3dsw24Vowcdsksg5wrPrfNIvZ7muDALPKC8OnPz9F215AO40GUeQGKxWXPcIT2ATbgoOxxXj0uWMFh8_atK9takwWYN5cc8ox39eFfL-vDgaCQAGRKv_irmaDmV9ZGMao0qEaxVRNLypTUIboK9ZG0_pvBCBzP6HvcQEyY_MC2If5voAjNIxDRAFFOg","expires_in":10000,"token_type":"Bearer"}
http2 İsteğini http Vekil -> Socks Proxy Üzerinden Geçirelim
Önce vekil sunucuyu ayaklandıralım:
w2 run -H 192.168.188.36 --uiport 891 --httpPort 777 --httpsPort 888 --socksPort 999
Şimdi HTTP/2 isteklerini vekil sunucu içinden geçireceğimizi ve Tünel bağlantılarını yakalayacağımızı HTTPS düğmesine basarak açılan ekranda işaretleyelim:
Şimdi kuralımızı yazalım ve böylece 10.10.23.53 adresli sunucuya ancak VPN ile bağlanabildiğim için ssh -D 6000 ubuntu@192.168.13.53
ile socks (TCP/UDP isteklerini yönlendirebileceğimiz) vekil sunucu olarak çalıştıralım.
ssh -D 192.168.188.36:6000 ubuntu@192.168.13.71 -vvv -N
10.10.23.53
Adresinde ngHttp2 kütüphanesini kullanarak http2 çalışan sunucumuza yapacağımız http2 isteklerini aşağıdaki kural ile WSL olarak çalışan Ubuntu sanal makinemizin (192.168.188.36
) IP adresinin 6000 portuna yönlendirmek istediğimizi kurallara ekleyelim.
http://10.10.23.53:8207/ socks://192.168.188.36:6000
Nodejs ile http2 istekleri yapabileceğimiz, içinde vekil sunucu ayarları olan haliyle kodumuzu koşturalım:
import http2 from 'http2';
import http from 'http';
import url from 'url';
// Proxy URL ve Hedef URL
const proxyUrl = 'http://192.168.188.36:777';
const targetUrl = 'http://10.10.23.53:8207/oauth2/token';
// Proxy ve Hedef URL'leri parse et
const proxy = url.parse(proxyUrl);
const target = url.parse(targetUrl);
// Proxy ayarları
const proxyOptions = {
host: proxy.hostname,
port: proxy.port,
headers: {
// 'Proxy-Authorization': `Basic ${auth}` // Kimlik doğrulaması gerekmiyorsa yoruma alınabilir
}
};
// HTTP proxy üzerinden CONNECT yöntemiyle bir tünel oluşturuyoruz
const req = http.request({
...proxyOptions,
method: 'CONNECT',
path: `${target.hostname}:${target.port}` // Proxy'ye hedef sunucu bilgilerini veriyoruz
});
req.on('error', (err) => {
console.error(`Proxy request error: ${err.message}`);
});
req.on('connect', (res, socket, head) => {
if (res.statusCode !== 200) {
console.error(`Proxy connection failed with status code: ${res.statusCode}`);
return;
}
// HTTP/2 istemcisi oluşturma
const client = http2.connect(`http://${target.hostname}:${target.port}`, {
createConnection: () => socket
});
client.on('error', (err) => {
console.error(err);
});
const payload = 'afId=Netflix&grant_type=client_credentials&scope=3gpp-monitoring-event';
// HTTP/2 POST isteği oluşturma
const req2 = client.request({
':method': 'POST',
':path': target.path,
'content-type': 'application/x-www-form-urlencoded',
'content-length': Buffer.byteLength(payload)
});
req2.setEncoding('utf8');
req2.write(payload);
req2.on('response', (headers, flags) => {
console.log('Yanıt Başlıkları:', headers);
req2.on('data', (chunk) => {
console.log('Yanıt Verisi:', chunk.toString());
});
req2.on('end', () => {
console.log('Yanıt Alındı.');
client.close();
});
});
req2.on('error', (err) => {
console.error(`Server request error: ${err.message}`);
});
req2.end();
});
req.end();
İşte sonuç. İstek bir tünel ile vekil sunucu üzerinden socks tüneline aktığını görüyoruz:
got Kütüphanesiyle Socks Proxy Üzerinden
got Kütüphanesi ile istekler yapılacak socks-proxy-agent ile socks tüneline istek yönlendirilecek
/**
* Öncesinde `ssh -D 6000 ubuntu@192.168.13.71` bir terminalde açılmalı
*/
import got from 'got';
import { SocksProxyAgent } from 'socks-proxy-agent';
const proxyOptions = {
protocol: 'socks5',
hostname: 'localhost',
port: 6000,
username: null,
password: null
};
let agent = {
// HTTP request
http: new SocksProxyAgent(proxyOptions, { tunnel: true, timeout: 5000 })
};
const options = {
url: 'http://10.10.23.53:81', // HTTP request
agent: agent
};
(async () => {
try {
const response = await got.get(options);
console.log(response.body);
} catch (error) {
console.error(error);
}
})();
NOTLAR
Kendinden imzalı sertifika oluşturmak:
$ openssl req -x509 \
-newkey rsa:4096 \
-keyout key.pem \
-out cert.pem \
-sha256 \
-days 3650 \
-nodes \
-subj "/C=XX/ST=StateName/L=CityName/O=CompanyName/OU=CompanySectionName/CN=CommonNameOrHostname"