我正在构建一个SSL搜寻器应用程序,用户在其中传递域名,NodeJS使用tls
库检索SSL证书。
首先,这是我的代码:
server.js
const tls = require('tls');
var rootCas = require('ssl-root-cas/latest').create();
const fs = require('fs');
fs.readdirSync('./keys/intermediate_certs').forEach(file => {
rootCas.addFile('./keys/intermediate_certs/' + file)
});
var secureContext = tls.createSecureContext({
ca: rootCas
});
options = {
host: host, //domain like google.com
port: 443,
secureContext: secureContext,
ca: rootCas,
rejectUnauthorized: true
};
var tlsSocket = tls.connect(options, function () {
let rawCert = tlsSocket.getPeerCertificate()
console.log(rawCert)
})
tlsSocket.on('error', (error) => {
console.log(error)
// [ERR_TLS_CERT_ALTNAME_INVALID] Hostname/IP does not match certificate's altnames: Host: zdns.cn. is not in the cert's altnames: DNS:*.fkw.com, DNS:fkw.com
// unable to verify the first certificate or UNABLE_TO_VERIFY_LEAF_SIGNATURE
});
[问题是nodejs应用程序抛出错误,根据TLS
文档,该错误来自OpenSSL,但是,在浏览网站时,view certificate
显示所有有效(甚至是完全匹配的通用名称)。
这里有一些标准:
ERR_TLS_CERT_ALTNAME_INVALID
;从浏览器查看证书时,显示*.zdns.cn
unable to verify the first certificate
;从浏览器查看证书时,它显示www.knet.cn
注意:我包含了来自ssl-root-cas
的最新根CA,还从CA站点手动下载了intermediate certificate
。
由于您的rejectUnauthorized
参数,您正在收到该错误。证书将*.fkw.com
表示为CN,并将*.fkw.com
和fkw.com
表示为备用名称。这些都不匹配zdns.cn
或www.zdns.cn
。
如果您只是在爬行以获取证书,则可能要删除rejectUnauthorized
。或者,该错误似乎确实显示了该错误中的其余证书信息。因此,您可以按原样保留它,并在输出信息中包含有关为什么证书不受信任/无效的信息。对于抓取证书的爬虫来说,这似乎是有价值的信息。