我正在尝试向特定域发出POST请求(我将其称为api.example.com/base),但我无法通过conditional SSL certificate checking nodejs does in the tls module。我可以在Curl中执行相同的POST请求而不会出现问题,并且我可以向nodejs中的其他域执行POST请求,但不能对此特定域(在Curl中也可以正常工作)进行
。POST请求:
function PostReq() {
let chunks = [], resData = '';
const postData = decodeURIComponent(qs.stringify({
property1: 'value1',
property2: 'value2'
}));
const options = {
headers: {
host: 'api.example.com',
path: '/base',
port: 443,
method: 'POST',
'Content-Type': 'application/x-www-form-urlencoded;',
'Content-Length': Buffer.byteLength(postData),
}
};
const reqPost = https.request(options, (res) => {
res.setEncoding('utf8');
if (res.statusCode === 200) {
console.log('got successfull http response');
res.on('data', (chunk) => {
console.log('getting chunks...');
chunks.push(chunk);
});
res.on('end', () => {
resData = Buffer.concat(chunks).toString();
console.log('response body data: ', resData);
});
} else {
console.error('received http status code: ', res.Statuscode);
}
});
reqPost.write(postData);
reqPost.on('error', (err) => {
console.error('error: ', err);
});
reqPost.end();
}
PostReq();
错误消息:
Error [ERR_TLS_CERT_ALTNAME_INVALID]: Hostname/IP does not match certificate's altnames: Host: api.example.com. is not in the cert's altnames: mydomain.com, DNS:www.mydomain.com
at Object.checkServerIdentity (tls.js:283:12)
at TLSSocket.onConnectSecure (_tls_wrap.js:1331:27)
at TLSSocket.emit (events.js:223:5)
at TLSSocket._finishInit (_tls_wrap.js:794:8)
at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:608:12) {
reason: "Host: api.example.com. is not in the cert's altnames: mydomain.com, DNS:www.mydomain.com"
堆栈:
nginx或letsencrypt日志中都没有错误,所以很好。
我曾尝试将NPM配置设置ssl-strict设置为false,但没有帮助。有一种可能可行的解决方案,将 rejectUnauthorized 值设置为 false ,但这会导致严重的安全问题,如果有人知道这是什么,我会尽量避免让id感激。在这里进行以及如何解决。
答案 0 :(得分:0)
已解决。
我在上面的代码中犯了一个非常明显的错误,我在headers对象中添加了所有options属性。
我做了什么:
const options = {
headers: {
host: 'api.example.com',
path: '/base',
port: 443,
method: 'POST',
'Content-Type': 'application/x-www-form-urlencoded;',
'Content-Length': Buffer.byteLength(postData),
}
};
我应该做的(正确的方法):
const options = {
host: 'api.example.com',
path: '/base',
port: 443,
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded;',
'Content-Length': Buffer.byteLength(postData)
}
};
因此,如果您遇到此问题,请仔细检查您的代码格式,有时该问题只是一个简单的缺陷!