trojan-go icon indicating copy to clipboard operation
trojan-go copied to clipboard

[BUG]SSL证书在更新过后,不会自行重载

Open digits122 opened this issue 2 years ago • 4 comments

trojan-go版本分别为0.7.4,0.10.5,两个版本均试过

服务器上trojan-go一直处于启动状态,从未重启过。 所以一直运行无问题,一直使用到证书过期,才发现无法连接了。

此时到服务器查看,其实证书文件fullchain.pem已经是自动更新了,但trojan-go使用的依然是上一个版本的过期旧证书,即使它已经更新了,它不会自动重新载入新的证书文件。手动重启trojan-go服务端,它重新加载新的证书文件,问题解决。

服务器上的trojan在最前端,不应该需要重启才能加载更新后的证书文件,需要修复这个问题。

digits122 avatar Nov 09 '21 07:11 digits122

可以用systemd写一个文件变化后自动重启trojan-go的

0x5826 avatar Nov 12 '21 06:11 0x5826

2022/3/9问题重现,上次出现问题之后,做了一次重启,没有详细记录下来,也没完全搞清楚是什么原因,这次又出现了。我不是想简单重启解决问题,我想知道这个错误的细节原因,所以记录一下。

上次重启在12月2日,是直接做服务器整个重启。

2

配置文件中配置到的地址是/etc/letsencrypt/live目录下的wildcard certificate live目录中是一个软链接,指向/etc/letsencrypt/archive目录下的证书文件,证书文件是定期滚动更新的。 更新过后,软链接也会更新,重新指向为新的证书文件,最近一次更新是在2月7日

4

archive目录下有历次的证书文件,显示12月9日的是fullchain6.pem,也正是当前服务器所用的证书文件,但是链接已经更新到fullchain7.pem,实际上用的还是fullchain6.pem

3

实际访问显示ssl error ,证书过期,证明用的仍然是6,但软链接实际上已经更新了。

1

仍然没明白造成问题的具体原因。做个记录并再次重启,看看下次出现问题是什么时候。

digits122 avatar Mar 09 '22 09:03 digits122

已重启,下次如若再次遇到同样问题会回来记录 5

digits122 avatar Mar 09 '22 10:03 digits122

这个问题,猜测一下的话,就是trojan-go程序启动时会把证书文件加载进自己的stack。然后就不再检查硬盘上的证书文件是否变化了。 在trojan-go本身不修改的情况下,解决方案是使用lets encrypt certbot的deploy-hook功能: https://eff-certbot.readthedocs.io/en/stable/using.html#renewing-certificates

If you want your hook to run only after a successful renewal, use --deploy-hook in a command like this. certbot renew --deploy-hook /path/to/deploy-hook-script You can also specify hooks by placing files in subdirectories of Certbot’s configuration directory. Assuming your configuration directory is /etc/letsencrypt, any executable files found in /etc/letsencrypt/renewal-hooks/pre, /etc/letsencrypt/renewal-hooks/deploy, and /etc/letsencrypt/renewal-hooks/post will be run as pre, deploy, and post hooks respectively when any certificate is renewed with the renew subcommand. These hooks are run in alphabetical order and are not run for other subcommands.

simplerick-simplefun avatar Apr 21 '22 11:04 simplerick-simplefun

同样的问题 证书更新后不会自动重载,使用ProxySU 安装的,敢问楼上大佬有自动的解决方案吗

xxwn2020 avatar Aug 24 '22 13:08 xxwn2020

我在/etc/letsencrypt/renewal-hooks/post文件夹里加了一个文件, 内容是 service trojan-go restart service nginx restart 给了执行权限chmod u+x 这里我的trojan-go已经可以用service来启动/停止/重启了,另外我用的nginx来做网页 供参考

simplerick-simplefun avatar Aug 24 '22 14:08 simplerick-simplefun

谢谢建议,如果是用 acme.sh 生成的证书没有/etc/letsencrypt文件夹 应该怎么使用renew-hooks 命令呢

xxwn2020 avatar Aug 27 '22 07:08 xxwn2020

谢谢建议,如果是用 acme.sh 生成的证书没有/etc/letsencrypt文件夹 应该怎么使用renew-hooks 命令呢

你在哪里有更新证书的code,就在哪里加restart service的code。具体你怎么用的acme.sh,别人也不会知道。

simplerick-simplefun avatar Aug 27 '22 13:08 simplerick-simplefun

2022/9/5 问题再次出现,这个问题似乎无法解决。而且不属于trojan-go的问题,这是一个普遍存在的问题,包括nginx也存在这样的问题,我已经切换到nginx+websocket+vmess+伪站+cdn模式,nginx还可以通过nginx -s reload重新加载配置软重启解决,trojan-go只能先kill再重启来解决。simplerick-simplefun 提到的使用/etc/letsencrypt/renewal-hooks/post是可行的办法,这样3个月1次reload nginx已经是最好方案了,除此之外就是使用crontab定时reload nginx,这个issue关闭。

digits122 avatar Sep 05 '22 10:09 digits122

最终解决方案:

前提,使用certbot来管理自动更新证书的

cd /etc/letsencrypt/renewal-hooks/post touch renew_post.sh chmod +x renew_post.sh

renew_post.sh中输入重新加载/重启脚本

(使用nginx) #!/bin/bash nginx -s reload

(使用trojan-go) #!/bin/bash systemctl restart trojan-go

digits122 avatar Sep 05 '22 10:09 digits122