节点检索旧的 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();
});
结果包括以下内容:
- 主题:
{ CN: '*.stackexchange.com' }
- 发行人:
{ C: 'US', O: "Let's Encrypt", CN: 'R3' }
- valid_from:
Dec 3 14:00:52 2020 GMT
- valid_to:
Mar 3 14:00:52 2021 GMT
- 指纹256:
C6:D3:6E:68:38:EC...
请注意,这是一个过期的证书。
相比之下,当我在 Firefox 中访问 whosebug.com
时,它会加载包含以下详细信息的证书:
- 不早于:
Sun, 06 Mar 2022 14:17:27 GMT
- 不在:
Sat, 04 Jun 2022 14:17:26 GMT
之后
- SHA-256:
04:F7:14:2A:28:EF:1F...
Node 似乎正在获取旧证书。也许它被缓存在某个地方?
我的平台是:
- 节点 v17.8.0
- Linux、x64、Manjaro
我得到了与您的原始代码相同的无效证书,所以我看了一下 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',
[...]
我使用以下代码为 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();
});
结果包括以下内容:
- 主题:
{ CN: '*.stackexchange.com' }
- 发行人:
{ C: 'US', O: "Let's Encrypt", CN: 'R3' }
- valid_from:
Dec 3 14:00:52 2020 GMT
- valid_to:
Mar 3 14:00:52 2021 GMT
- 指纹256:
C6:D3:6E:68:38:EC...
请注意,这是一个过期的证书。
相比之下,当我在 Firefox 中访问 whosebug.com
时,它会加载包含以下详细信息的证书:
- 不早于:
Sun, 06 Mar 2022 14:17:27 GMT
- 不在:
Sat, 04 Jun 2022 14:17:26 GMT
之后
- SHA-256:
04:F7:14:2A:28:EF:1F...
Node 似乎正在获取旧证书。也许它被缓存在某个地方?
我的平台是:
- 节点 v17.8.0
- Linux、x64、Manjaro
我得到了与您的原始代码相同的无效证书,所以我看了一下 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 theservername
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',
[...]