【问题标题】:How do I use the node.js request module to make an SSL call with my own certificate?如何使用 node.js 请求模块使用我自己的证书进行 SSL 调用?
【发布时间】:2013-02-21 16:39:45
【问题描述】:

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

https://github.com/mikeal/request

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

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

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

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

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

【问题讨论】:

  • 你得到你需要的东西了吗?我需要做同样的事情。你能分享一些你是如何做到的吗?谢谢

标签: node.js ssl https request certificate


【解决方案1】:
  1. “代理”表示来自节点标准http 模块的http.Agent 实例
  2. 文档表明此代理实例将在pool 选项中传递给request,我相信,虽然我自己没有这样做,而且文档在这里的细节确实很少。基于略读代码,我认为您可能只需要options.ca
  3. 请求似乎直接支持getAgent中的options.causes it here

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

【讨论】:

    【解决方案2】:

    这在很大程度上阐述了Peter Lyons' answer,并提供了一个示例。

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

    当您使用request library 时,不需要自己实际实例化代理,您可以简单地为您提出的请求提供一些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" 必须是签名证书颁发机构的证书。

    【讨论】:

    • 如果我想接受由中间人签署的证书怎么办?我尝试了所有组合(CA、IA;CA;甚至 IA、CA),但我的证书从未经过验证(UNABLE_TO_VERIFY_LEAF_SIGNATUREUNABLE_TO_GET_ISSUER_CERT
    • 如何使用 fetch 来做到这一点?
    • @Sibelius 你是什么意思?
    • 使用节点获取
    【解决方案3】:

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

    我刚刚使用我的 google maps api 调用对此进行了测试,如果我 require('http')Google 抱怨它希望通过 SSL 进行调用,但是当我添加 s 时,一切都按预期工作。

    【讨论】:

      【解决方案4】:
      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

      【讨论】:

        猜你喜欢
        • 2020-04-27
        • 1970-01-01
        • 1970-01-01
        • 2020-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-11
        • 1970-01-01
        相关资源
        最近更新 更多