我使用以下代碼獲取服務器 TLS 證書stackoverflow.com:
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 GMT - 有效:
Mar 3 14:00:52 2021 GMT - 指紋256:
C6:D3:6E:68:38:EC...
請注意,它是一個過期的證書。
相比之下,當我stackoverflow.com在 Firefox 中訪問時,它會加載包含以下詳細資訊的證書:
- 不是之前:
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
uj5u.com熱心網友回復:
我得到了與您的原始代碼相同的無效證書,所以我查看了檔案,它有以下有趣的花絮:
與
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://www.uj5u.com/caozuo/456109.html
