节点检索旧的 TLS 证书

Node retrieving old TLS certificate

我使用以下代码为 whosebug.com 获取服务器 TLS 证书:

const tls = require('tls');

const conn = tls.connect({
  host: 'whosebug.com',
  port: 443,
  rejectUnauthorized: false
}, () => {
  const cert = conn.getPeerCertificate(false);
  console.log(cert);
  conn.destroy();
});

结果包括以下内容:

请注意,这是一个过期的证书。

相比之下,当我在 Firefox 中访问 whosebug.com 时,它会加载包含以下详细信息的证书:

Node 似乎正在获取旧证书。也许它被缓存在某个地方?

我的平台是:

我得到了与您的原始代码相同的无效证书,所以我看了一下 documentation,它有以下有趣的花絮:

Unlike the https API, tls.connect() does not enable the SNI (Server Name Indication) extension by default, which may cause some servers to return an incorrect certificate or reject the connection altogether. To enable SNI, set the servername option in addition to host.

添加 servername 选项:

const tls = require('tls');

const conn = tls.connect({
  host: 'whosebug.com',
  servername: 'whosebug.com',
  port: 443,
  rejectUnauthorized: false
}, () => {
  const cert = conn.getPeerCertificate(false);
  console.log(cert);
  conn.destroy();
});

我获得有效证书:

subject: [Object: null prototype] { CN: '*.stackexchange.com' },
[...]
valid_from: 'Mar  6 14:17:27 2022 GMT',
valid_to: 'Jun  4 14:17:26 2022 GMT',
[...]