文档中心
Nodejs濡備綍楠岃瘉SSL璇佷功锛?涓綘蹇呴』鐭ラ亾鐨勫畨鍏ㄨ鐐?txt
时间 : 2025-09-27 16:28:02浏览量 : 6

SSL证书是互联网安全的"身份证",就像你去银行办业务需要核对身份证一样,Node.js与服务端通信时也要验证对方的SSL证书是否可信。但很多开发者容易忽略这个环节,导致中间人攻击风险。本文用实际代码示例带你彻底搞懂Node.js中的证书验证机制。
一、为什么需要手动验证SSL证书?
默认情况下,Node.js的HTTPS模块会自动验证证书,但以下场景需要手动干预:
```javascript
// 危险!跳过证书验证(永远不要在生产环境使用)
const https = require('https');
const agent = new https.Agent({
rejectUnauthorized: false // 相当于"闭眼"接受所有证书
});
```
这就像海关不检查护照直接放行。2025年某金融APP就因类似配置导致用户数据被中间人窃取。
二、基础验证:检查证书链有效性
Node.js默认会验证:
1. 证书是否过期(检查notBefore/notAfter日期)
2. 签发机构是否受信任(CA证书链)
3. 域名是否匹配(CN或SAN扩展)
用代码检查这些属性:
const certs = require('ssl-root-cas').create();
https.get({
hostname: 'example.com',
agent: new https.Agent({
ca: certs // 显式指定信任的根证书
})
}, (res) => {
const cert = res.socket.getPeerCertificate();
console.log('颁发给:', cert.subject.CN);
console.log('有效期至:', new Date(cert.valid_to));
三、高级技巧:钉死特定证书(Certificate Pinning)
为防止CA被入侵导致的伪造证书,可以固定预期证书指纹:
const tls = require('tls');
const HASH_EXPECTED = 'SHA256:ABC123...';
tls.checkServerIdentity = (hostname, cert) => {
const hash = cert.fingerprint256.replace(/:/g, '').toUpperCase();
if (hash !== HASH_EXPECTED.replace(/SHA256:|:/g, '')) {
throw new Error('证书指纹不匹配!可能遭到中间人攻击');
}
};
这相当于只认某张特定身份证,连公安局新发的都不认。Telegram等应用就采用这种策略。
四、实战:自签名证书的特殊处理
开发环境常用自签名证书,需要这样处理:
const fs = require('fs');
const options = {
key: fs.readFileSync('server.key'),
cert: fs.readFileSync('server.crt'),
requestCert: true, // 要求客户端也提供证书
rejectUnauthorized: false // 【开发环境】允许无效证书
https.createServer(options, (req, res) => {
const clientCert = req.socket.getPeerCertificate();
if (!clientCert || Object.keys(clientCert).length ===0) {
return res.end('请提供客户端证书');
}}).listen(443);
注意:生产环境必须移除`rejectUnauthorized: false`!
五、常见漏洞与修复方案
?错误1:忽略OCSP装订检查
// 【不安全】未检查OCSP响应
const options = {
ocsp: undefined // Node.js默认不检查OCSP
修复方案:启用OCSP装订验证实时吊销状态:
ocsp: async (servername, callback) => {
const ocspResp = await checkOCSP(servername);
callback(null, ocspResp);
}};
?错误2:弱加密套件配置
// 【不安全】允许已破解的加密算法
ciphers: 'DES-CBC3-SHA'
修复方案:使用Mozilla推荐的现代加密套件:
ciphers: [
'TLS_AES_256_GCM_SHA384',
'TLS_CHACHA20_POLY1305_SHA256'
].join(':')
六、终极检查清单
1. 必须启用 `rejectUnauthorized: true`(生产环境)
2. 定期更新 CA根证书库(如使用`ssl-root-cas`包)
3. 关键服务实现证书钉扎(Pinning)
4. 日志记录所有验证失败的连接尝试
5. 监控工具如OpenSSL命令定期测试:
```bash
openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -dates
```
通过正确实施这些措施,你的Node.js应用将建立起类似HTTPS浏览器的完整信任链。记住:安全不是功能开关,而是一个持续加固的过程。
TAG:nodejs验证ssl证书,nodejs 验证码,nodejs ssl证书,nodejs表单验证