21

我正在使用 node.js 和这个请求模块对另一台服务器进行 HTTP 调用。

https://github.com/mikeal/request

它工作得很好。我现在需要修改此代码以使用我公司的 SSL 证书通过 SSL 进行调用。在请求模块的文档中,它说明了 strictSSL 选项:

“strictSSL - 设置为 true 以要求 SSL 证书有效。注意:要使用您自己的证书颁发机构,您需要指定使用该 ca 作为选项创建的代理。”

这听起来像是我需要做的,但我不明白这句话:“指定一个使用该 ca 作为选项创建的代理。”。

1)他们所说的“代理人”是什么意思?2) 我如何“指定代理” 3) 我如何创建代理“以该 ca 作为选项”?

一个代码示例会很棒,但任何线索都会有所帮助。谢谢。

4

4 回答 4

14

这在很大程度上详细说明了Peter Lyons 的回答,并提供了一个例子。

我假设您正在请求使用由您自己的证书颁发机构 (ca) 签名的证书通过 HTTPS 运行的域。

当你使用请求库时,不需要自己实际实例化代理,你可以简单地为agentOptions你提出的请求提供一些。下面是一个例子:

request({
  method: "POST",
  uri: "https://localhost/entries",
  headers: {
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    name: "someEntry"
  }),
  agentOptions: {
    ca: fs.readFileSync("certs/ca.cert.pem")
  }
}, function(error, httpResponse, body) {
  //handle response
});

这里重要的是agentOptions,您提供 ca 的证书。现在接受所有使用由 ca 签名的证书的域。想象一个 ca CA1签署了三个域,D1D2D3。将 ca 设置为CA1会导致允许对所有域D1D2D3的请求(但不允许D4由不同的 ca 签名)。

要点是:"certs/ca.cert.pem"必须是签名证书颁发机构的证书。

于 2014-10-29T11:40:24.070 回答
5
  1. “代理”是指节点标准模块中的http.Agent实例http
  2. 文档表明该代理实例将在我相信requestpool选项中传递给,尽管我自己没有这样做,并且文档确实在这里的细节上很少。基于略读代码,我认为您可能只需要options.ca
  3. request 似乎直接支持options.ca 并在这里使用它getAgent

所以我的猜测可能只是options.ca作为一个字符串传入,该字符串是贵公司证书颁发机构的公钥,然后查看请求是否从那里做正确的事情。

于 2013-03-06T18:32:56.870 回答
2
const request = require('request');

request.post({
                url: strRSAUrl,
                agentOptions: {
                    ca: fs.readFileSync('path-to-cacert.pem')
                },
                form: {
                    some_key: some_value,
                }
            }, function (error, response, body) {
                objResponse.send(body);
            });

有关详细信息,您可以参考nodejs#request

于 2017-11-04T15:01:53.200 回答
1

也许我误解了这个问题,但根据我的经验,如果你不需要做任何特别的事情require('https'),呼叫会自动通过 SSL 发出。

我刚刚用我的谷歌地图 api 调用测试了这一点,事实上,如果我require('http')谷歌抱怨它希望调用通过 SSL 进行,但是当我添加时,s一切都按预期工作。

于 2014-12-12T07:34:49.470 回答