为了省事把加密私钥的口令写在配置注释里,半年后仓库被外包拉走,安全扫描直接在历史提交里翻出了这行。乍看像缓存或者权限的锅,追下去往往不是。

openssl rsa -in encrypted.key -out plain.key
chmod 600 plain.key
chown www-data:www-data plain.key

追下去是这么回事:nginx 本身不支持在配置里写私钥口令,每次 reload 都要交互输入,很多人就把它塞进启动脚本或注释。配置文件跟着代码入库,口令等于公开。

「私钥口令明文」这类改动最怕改一半,回滚脚本先准备好,再动生产。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。

具体做法是,先把私钥解密成不带口令的版本,权限收到 600,属主设为运行用户;清掉配置和脚本里的口令,启动流程改成不依赖交互输入;口令已经进过仓库的,直接换密钥重签证书,历史提交清不干净。

验收就看一点,配置里搜不到口令,nginx -t 通过,reload 不再提示输入密码。

作者 9823189