说到自签证书占位救急这事儿,我到现在想起来都忍不住捂脸。上个月手贱,清理服务器的时候误删了一个SSL证书目录,结果第二天早上发现网站全挂了。当时第一反应是“完了完了”,赶紧查日志,果不其然——Nginx启动时找不到证书文件,直接罢工。1Panel面板里网站管理页面也打不开,因为OpenResty没起来,死循环。

更坑的是,那个站点已经跑了半年,证书是Let‘s Encrypt自动续的,结果续签失败后旧证书被清理,偏偏文件被我顺手删了。你说巧不巧?运维最怕这种“鸡生蛋蛋生鸡”的局面:面板依赖OpenResty,OpenResty依赖证书,证书不存在面板就用不了。想改配置?没门。想重新生成证书?面板的按钮是灰的。
这时候我突然想起以前看过一个骚操作——自签证书占位。说白了就是伪造一个证书文件塞进去,让Nginx以为证书还在,先启动起来,后面再正式申请。当时心里也没底,但这招真是救命稻草。
先找到证书目录,我那会目录是/opt/1panel/apps/openresty/openresty/www/sites/yourdomain.com/ssl/,要是目录不存在就mkdir -p建一个。然后一行命令生成自签证书:
openssl req -x509 -nodes -days 365 -newkey rsa:2048
-keyout /opt/1panel/apps/openresty/openresty/www/sites/yourdomain.com/ssl/privkey.pem
-out /opt/1panel/apps/openresty/openresty/www/sites/yourdomain.com/ssl/fullchain.pem
-subj "/CN=yourdomain.com"
注意-subj里的域名要跟站点配置一致,不然虽然能启动,但浏览器会报域名不匹配警告。不过咱们是占位救急,管不了那么多了。
生成完重启OpenResty:docker restart $(docker ps -a --filter "name=openresty" -q),瞬间容器状态变成“运行中”。整个服务器像被打了一针强心针,面板也恢复正常了。
进去了之后呢?立马到面板里重新申请正式SSL证书,把自签证书替换掉。整个过程不到五分钟,但效率极高。原本以为要重装整个站点,结果一杯咖啡的功夫就搞定了。
说白了,Nginx/OpenResty启动时只检查证书文件是否存在,并不验证证书是否由可信CA签发。所以哪怕是自己签的假证书,也能骗过Nginx让它乖乖启动。这种“占位符”思路在很多运维场景都适用——比如配置文件缺失时用默认配置顶替,或者数据库链接不上时先mock一个。
不过要当心,占位证书只是临时解决方案。一定要在恢复访问后第一时间换成正式证书,否则用户访问时会看到安全警告,那就不美观了。我那次就是因为手忙脚乱忘了替换,结果被用户喷了一顿。
对了,如果你也遇到类似问题,但自签证书生成后还是启动不了,注意检查证书文件权限。我一开始生成完发现容器还是重启,后来用ls -l一看,当前用户root生成的证书,OpenResty容器里跑的nginx进程是www-data用户,读不了。加个chmod 644就好。
总之,自签证书占位这招,我愿称之为运维界的“创可贴”——虽然不解决问题根源,但能让你先止血,赢得时间去处理真正的问题。下次谁再说我删证书文件是手贱,我就把这篇甩他脸上。
参与讨论
这招真是运维必备,手误删过证书的痛懂😭
之前用自签证书救场,忘了改权限折腾了半小时,文章提醒得好