很多人一看到“TLS证书轮换”和“密钥轮换”,下意识觉得是同一件事——不就是换个证书嘛。其实不然,这俩动作目的相似,但操作对象、安全影响和执行方式差得挺远。
证书轮换:换的是“身份证”
你可以把TLS证书理解成服务器的“数字身份证”,上面有域名、签发机构、有效期,还有一对公钥(公开)和私钥(保密)。证书轮换,主要是换掉即将过期或已被吊销的证书文件(比如 example.com.crt),通常连带更新中间证书链。
关键点在于:私钥可以不变。只要私钥没泄露,重签一个新证书用原来的私钥完全可行。比如用 OpenSSL 重新生成 CSR 后让 CA 签发:
openssl req -new -key server.key -out new.csr
这里 server.key 就是老私钥,没动它。
密钥轮换:换的是“锁芯”
密钥轮换,换的是私钥本身(server.key)。相当于把门锁整个换了——旧钥匙作废,新钥匙启用。这事儿更敏感,因为一旦私钥泄露,攻击者能解密历史流量(如果启用了不支持前向保密的密码套件),还能冒充服务器做中间人。
所以密钥轮换必须配合证书轮换:新私钥生成后,得拿它重新申请证书,否则证书里的公钥和你手上的私钥就对不上了,服务直接启动失败。
openssl genrsa -out server_new.key 3072
openssl req -new -key server_new.key -out new.csr
为什么不能只换证书不换密钥?
能,而且日常维护中90%的情况都这么干——省事、安全风险低。但遇到私钥疑似泄露、合规审计要求(如金融行业强制每年更新密钥)、或想启用更强算法(比如从RSA 2048升级到ECDSA P-384)时,就必须轮换密钥。
顺手提醒两个实操细节
1. Nginx 或 Apache 配置里,ssl_certificate 和 ssl_certificate_key 指向的文件要同步更新,别漏改一个;
2. 轮换后用 openssl s_client -connect example.com:443 -servername example.com 看一眼,确认返回的证书有效期和公钥指纹已更新。
一句话记牢
证书轮换是“换证不换锁”,密钥轮换是“换锁又换证”。前者勤快就行,后者得谨慎再谨慎。