如何使用node.js请求模块使用我自己的证书进行SSL调用?

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

https://github.com/mikeal/request

它工作很好。 我现在需要修改这个代码,使用我公司的SSL证书通过SSL进行呼叫。 在请求模块的文档中,它提到了strictSSL选项:

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

这听起来像我需要做的,但我不明白这个短语:“指定一个代理是与该ca创build作为一个选项”。

1)“代理人”是什么意思? 2)如何“指定代理”3)如何创build代理“使用该代理作为选项”?

一个代码示例将是惊人的,但任何线索都会有所帮助。 谢谢。

这在很大程度上阐述了彼得·莱昂斯的回答 ,举了一个例子。

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

当使用请求库的时候 ,你不需要自己实际的实例化代理,你可以简单地为你正在创build的请求提供一些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 ,它提供了agentOptions的证书。 所有使用由ca签名的证书的域现在都被接受。 想象一下CA1签署了三个域D1D2D3 。 将ca设置为CA1将导致允许请求所有域D1D2D3 (但不包括由另一个ca签名的D4 )。

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

  1. “代理”是指来自节点标准http模块的http.Agent的一个实例
  2. 文档指出这个代理实例将被传递到pool request我相信,虽然我自己没有做到这一点,文档确实稀疏在这里的细节。 基于略读代码,我想你可能只需要options.ca
  3. 请求似乎直接支持options.ca并在getAgent 使用它

所以我猜想可能只是在options.ca传递一个string,它是公司证书颁发机构的公钥,然后看看请求是否从那里做了正确的事情。

我遇到了同样的问题,并且在周围进行了挖掘,最后我发现这个testing案例是我们需要的最好的例子:

https://github.com/mikeal/request/blob/63f31cb1d170a4af498fbdd7566f867423caf8e3/tests/ssl/ca/server.js

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

我只是testing了这个与我的谷歌地图api调用,实际上,如果我require('http')谷歌抱怨说,它希望打电话来通过SSL,但是当我添加s一切按预期工作。

 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