我使用了以下代码来获得stackoverflow.com的服务器TLS证书
const tls = require('tls');
const conn = tls.connect({
host: 'stackoverflow.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' }Dec 3 14:00:52 2020 GMTMar 3 14:00:52 2021 GMTC6:D3:6E:68:38:EC...注意,这是一个过期的证书。
相比之下,当我在火狐中访问stackoverflow.com时,它会加载一个包含以下细节的证书:
Sun, 06 Mar 2022 14:17:27 GMTSat, 04 Jun 2022 14:17:26 GMT04:F7:14:2A:28:EF:1F...看来Node正在获得一个旧的证书。也许它被缓存在某个地方?
我的平台是:
发布于 2022-04-04 03:17:00
我获得了与原始代码相同的无效证书,因此我查看了文档,它有以下有趣的提示:
与
httpsAPI不同,tls.connect()默认不启用SNI (服务器名称指示)扩展,这可能导致某些服务器返回不正确的证书或完全拒绝连接。若要启用SNI,请在主机之外设置servername选项。
添加servername选项:
const tls = require('tls');
const conn = tls.connect({
host: 'stackoverflow.com',
servername: 'stackoverflow.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',
[...]https://stackoverflow.com/questions/71731614
复制相似问题