【问题标题】:How can I use an https proxy with node.js https/request Client?如何将 https 代理与 node.js https/request 客户端一起使用?
【发布时间】:2016-03-08 20:01:22
【问题描述】:

我需要通过 Intranet 代理将我的客户端 HTTPS 请求发送到服务器。 我同时使用 https 和 request+global-tunnel 两种解决方案似乎都不起作用。
与“http”类似的代码有效。还有其他我错过的设置吗?

代码失败并出现错误:

REQUEST:
problem with request: tunneling socket could not be established, cause=socket hang up

HTTPS:
events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: socket hang up
    at SecurePair.error (tls.js:1011:23)
    at EncryptedStream.CryptoStream._done (tls.js:703:22)
    at CleartextStream.read [as _read] (tls.js:499:24)

代码是简单的https测试。

var http = require("https");

var options = {
  host: "proxy.myplace.com",
  port: 912,
  path: "https://www.google.com",
  headers: {
    Host: "www.google.com"
  }
};

http.get(options, function(res) {
  console.log(res);
  res.pipe(process.stdout);
});

【问题讨论】:

  • 你解决了吗?有同样的问题
  • 嗨@DomingoC。希望我的回答可以为您和 James 提供一些见解。
  • @Domingo - 我实现了隧道代码以使其工作。您是否尝试过 Kevin M 解决方案?我可能会清理代码并稍后在此处发布答案。

标签: node.js https proxy


【解决方案1】:

您可能希望通过代理在您的节点应用和目标目的地之间建立 TLS 加密连接。

为此,您需要发送带有目标目标主机名和端口的 CONNECT 请求。代理将创建到目标主机的 TCP 连接,然后在您和目标目的地之间简单地转发数据包。

我强烈推荐使用request client。该软件包简化了发出 HTTP/S 请求的过程和处理。

使用request client的示例代码:

var request = require('request');

request({
    url: 'https://www.google.com',
    proxy: 'http://97.77.104.22:3128'
}, function (error, response, body) {
    if (error) {
        console.log(error);
    } else {
        console.log(response);
    }
});

不使用外部依赖的示例代码:

var http = require('http'),
    tls = require('tls');

var req = http.request({
    host: '97.77.104.22',
    port: 3128,
    method: 'CONNECT',
    path: 'twitter.com:443'
});

req.on('connect', function (res, socket, head) {
    var tlsConnection = tls.connect({
        host: 'twitter.com',
        socket: socket
    }, function () {
        tlsConnection.write('GET / HTTP/1.1\r\nHost: twitter.com\r\n\r\n');
    });

    tlsConnection.on('data', function (data) {
        console.log(data.toString());
    });
});

req.end();

【讨论】:

  • 很好的答案!对于多宿主服务器中的站点,您可能会收到“ERR_TLS_CERT_ALTNAME_INVALID”,请尝试在tls.connect 选项中添加servername: 'twitter.com'
  • 请求客户端现已弃用。
猜你喜欢
  • 2013-05-27
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 2016-12-29
相关资源
最近更新 更多