Nodejs 请求带有 .p12 证书的 Web 服务
Nodejs request to a web service with .p12 certificate
所以,标题很简单。我想使用一家公司的 Web 服务,我得到了 .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' ] }
在 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
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'),
})
});
所以,标题很简单。我想使用一家公司的 Web 服务,我得到了 .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' ] }
在 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
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'),
})
});