NodeJS tls.connect() getPeerCertificate() 返回错误(多)但浏览器显示正常

Jer*_*rry 5 ssl node.js tls1.2

我正在构建一个 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
});
Run Code Online (Sandbox Code Playgroud)

问题是 nodejs 应用程序抛出错误,根据TLS文档,错误来自 OpenSSL,但是,在浏览网站时view certificate显示所有有效(甚至通用名称完全匹配)。

以下是一些标准:

  1. zdns.cn / www.zdns.cn 显示错误:ERR_TLS_CERT_ALTNAME_INVALID; 当从浏览器查看证书时,它会显示*.zdns.cn
  2. knet.cn / www.knet.cn 显示错误:unable to verify the first certificate; 当从浏览器查看证书时,它会显示www.knet.cn

注意:我包含了最新的根 CA,ssl-root-cas并且还intermediate certificate从 CA 站点手动下载了它。

rfe*_*tag 0

您特别因为您的参数而收到该错误rejectUnauthorized。该证书显示*.fkw.com为 CN,并且显示*.fkw.comfkw.com备用名称。这些都不匹配zdns.cnwww.zdns.cn

如果您只是为了获取证书而爬行,则可能需要放弃rejectUnauthorized. 或者,该错误似乎确实显示了错误中的其余证书信息。因此,您可以保持原样,并在输出中包含有关证书不受信任/无效的原因的信息。对于抓取证书的爬虫来说,这似乎是有价值的信息。