证书管理
证书管理的基本概念
证书管理在Node.js中主要涉及数字证书的生成、验证、存储和使用。数字证书通常采用X.509标准格式,包含公钥、持有者信息、颁发机构信息和有效期等关键数据。在HTTPS通信、API认证和数据加密等场景中,证书管理都是核心环节。
const fs = require('fs');
const crypto = require('crypto');
// 生成自签名证书示例
const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {
modulusLength: 2048,
publicKeyEncoding: { type: 'spki', format: 'pem' },
privateKeyEncoding: { type: 'pkcs8', format: 'pem' }
});
证书生成与签发
Node.js可以通过crypto模块生成证书,常见方式包括自签名证书和CA签发证书。自签名证书适合开发和测试环境,而生产环境通常需要由受信任的CA机构签发。
const forge = require('node-forge');
// 使用node-forge生成CSR
const keys = forge.pki.rsa.generateKeyPair(2048);
const csr = forge.pki.createCertificationRequest();
csr.publicKey = keys.publicKey;
csr.sign(keys.privateKey);
// 将CSR转换为PEM格式
const pem = forge.pki.certificationRequestToPem(csr);
证书验证机制
证书验证包括链式验证、有效期检查和CRL/OCSP检查。Node.js的tls模块内置了证书验证功能,可以通过设置参数进行定制。
const https = require('https');
const tls = require('tls');
const options = {
host: 'example.com',
port: 443,
method: 'GET',
checkServerIdentity: (host, cert) => {
// 自定义验证逻辑
if (cert.subject.CN !== host) {
return new Error('证书域名不匹配');
}
}
};
证书存储方案
证书存储需要考虑安全性和可访问性。常见存储方式包括:
- 文件系统存储
- 数据库存储
- 密钥管理系统(KMS)
- 硬件安全模块(HSM)
// 使用AWS KMS存储私钥示例
const AWS = require('aws-sdk');
const kms = new AWS.KMS();
const params = {
KeyId: 'alias/my-key',
Plaintext: 'my-private-key-data'
};
kms.encrypt(params, (err, data) => {
if (err) console.log(err);
else console.log(data.CiphertextBlob);
});
证书轮换策略
证书轮换是安全运维的重要环节,需要考虑以下因素:
- 提前续期时间窗口
- 新旧证书并行期
- 自动化部署流程
- 回滚机制
// 自动化证书轮换脚本示例
const cron = require('node-cron');
const acme = require('acme-client');
cron.schedule('0 3 * * *', async () => {
const client = new acme.Client({
directoryUrl: acme.directory.letsencrypt.production
});
const cert = await client.auto({
csr: await forge.createCsr(),
email: 'admin@example.com',
termsOfServiceAgreed: true
});
fs.writeFileSync('/path/to/cert.pem', cert.certificate);
});
证书吊销处理
当证书私钥泄露或不再需要时,需要及时吊销证书。Node.js可以通过OCSP协议实现证书状态实时检查。
const ocsp = require('ocsp');
const server = ocsp.Server.create({
cert: fs.readFileSync('server.crt'),
key: fs.readFileSync('server.key')
});
server.addCert('serial', 'issuer', {
status: 'revoked',
reason: 'keyCompromise',
revocationTime: new Date()
});
server.listen(8080);
多域名证书管理
SAN(Subject Alternative Name)证书可以包含多个域名,管理这类证书需要特殊处理。
const san = {
altNames: [
{ type: 2, value: 'example.com' },
{ type: 2, value: 'www.example.com' },
{ type: 2, value: 'api.example.com' }
]
};
const cert = forge.pki.createCertificate();
cert.setSubject([{ name: 'commonName', value: 'example.com' }]);
cert.setExtensions([{
name: 'subjectAltName',
altNames: san.altNames
}]);
证书监控与告警
建立证书监控系统可以预防证书过期导致的服务中断。
const checkCertExpiry = (certPath) => {
const cert = fs.readFileSync(certPath);
const parsed = forge.pki.certificateFromPem(cert);
const expiry = parsed.validity.notAfter;
const daysLeft = Math.floor((expiry - new Date()) / (1000 * 60 * 60 * 24));
if (daysLeft < 30) {
sendAlert(`证书将在${daysLeft}天后过期`);
}
};
证书与密钥的安全实践
- 私钥必须加密存储
- 设置适当的文件权限
- 避免将证书提交到版本控制系统
- 使用环境变量管理敏感信息
// 设置文件权限示例
fs.chmodSync('private.key', 0o600);
fs.chmodSync('certificate.pem', 0o644);
// 使用dotenv管理环境变量
require('dotenv').config();
const key = process.env.SSL_KEY;
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn