如何使用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签署了三个域D1 , D2 , D3 。 将ca设置为CA1将导致允许请求所有域D1 , D2 , D3 (但不包括由另一个ca签名的D4 )。
"certs/ca.cert.pem"
是: "certs/ca.cert.pem"
必须是签名证书颁发机构的证书。
- “代理”是指来自节点标准
http
模块的http.Agent的一个实例 - 文档指出这个代理实例将被传递到
pool
request
我相信,虽然我自己没有做到这一点,文档确实稀疏在这里的细节。 基于略读代码,我想你可能只需要options.ca
- 请求似乎直接支持
options.ca
并在getAgent
使用它
所以我猜想可能只是在options.ca
传递一个string,它是公司证书颁发机构的公钥,然后看看请求是否从那里做了正确的事情。
我遇到了同样的问题,并且在周围进行了挖掘,最后我发现这个testing案例是我们需要的最好的例子:
也许我误解了这个问题,但根据我的经验,如果你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