【问题标题】:Nodejs request to a web service with .p12 certificateNodejs 向具有 .p12 证书的 Web 服务请求
【发布时间】:2018-04-04 06:52:42
【问题描述】:

所以,标题很简单。我想使用一家公司的网络服务,我得到了 .cer 和 .p12 文件。据说,我应该在发出请求时使用 .p12 。我已将 .cer 导入 Windows,我可以轻松地向邮递员提出请求。但是当我尝试使用 node.js 发出请求时,我得到了错误。这是代码,我正在使用request 模块:

var headersOpt = {
    "content-type": "application/json",
};

var options = {
    url: 'https://some-url/api',
    cert: fs.readFileSync(__dirname + '/certs/myCert.p12'),
    headers: headersOpt
};

request.get(options, (error, response, body) => {
    console.log(error);
    console.log(response);
    console.log(body);
});

我收到此错误:

{ Error: error:0906D06C:PEM routines:PEM_read_bio:no start line
    at Object.createSecureContext (_tls_common.js:89:17)
    at Object.exports.connect (_tls_wrap.js:1048:48)
    at Agent.createConnection (https.js:111:22)
    at Agent.createSocket (_http_agent.js:224:26)
    at Agent.addRequest (_http_agent.js:192:10)
    at new ClientRequest (_http_client.js:256:16)
    at Object.request (http.js:39:10)
    at Object.request (https.js:239:15)
    at Request.start (D:\parser\node_modules\request\request.js:748:32)
    at Request.end (D:\parser\node_modules\request\request.js:1512:10)
  opensslErrorStack:
   [ 'error:140DC009:SSL routines:SSL_CTX_use_certificate_chain_file:PEM lib' ] }

【问题讨论】:

    标签: node.js ssl openssl certificate p12


    【解决方案1】:

    agentOptions 中的pfx 属性用于pkcs12 格式:

    'use strict';
    
    const request = require('request');
    const fs = require('fs');
    
    var options = {
        url: 'https://some-url/api',
        headers: {
            "content-type": "application/json",
        },
        agentOptions: {
            pfx: fs.readFileSync(__dirname + '/certs/myCert.p12'),
            passphrase: ''
        }
    };
    
    request.get(options, (error, response, body) => {
        console.log(error);
        console.log(response);
        console.log(body);
    });
    

    如果您的证书是自签名的,请检查this

    【讨论】:

    • 谢谢,这确实解决了这个问题。它仍然不起作用,我之前尝试过这个版本几次,但后来我发现我输入了错误的密码。无论如何,感谢您指出正确的方法,以便我可以专注于其他事情,而不是尝试不同的组合!
    • 当我使用上面的,我得到 fs.readFileSync is not a function。
    • 除了使用 fs.readFileSync,还有其他选择吗?我得到它不是一个功能。注销时 fs 对象为空
    • 关于在请求中使用 pfx 文件的文档很少。如果可以的话,我会给你一百个赞,谢谢!
    【解决方案2】:

    Bertrand Martel 的另一条评论中的请求 API 已被弃用,因此不安全,您也可以使用 axios 来实现相同的目的:

    const fs = require('fs');
    const axios = require('axios');
    const https = require('https');
    
    const response = await axios.request({
        url: *URL_HERE*,
        method: 'post',
        headers: {
            "content-type": "application/json",
        },
        data: JSON.stringify({
            *YOUR_DATA_HERE*
        }),
        httpsAgent: new https.Agent({
            passphrase: *PASSPHRASE_HERE*,
            pfx: fs.readFileSync(__dirname + '\\..\\certificates\\certificate.p12'),
        })
    });
    

    【讨论】:

      猜你喜欢
      • 2018-03-18
      • 2018-09-29
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 2015-04-28
      • 2015-05-24
      • 2011-02-25
      相关资源
      最近更新 更多