请输入图片描述

一、问题

朋友的一台服务器配置了多域名的https,使用的是let's encrypt,所以每三月需要进行续期一次。

我之前写过一篇关于oneinstack自动部署let's encrypt的文章,地址:

他也是使用的 oneinstack ,并且写入了 自动 renew 的脚本在crontab中,但是今天突然两个域名无法 renew

二、发现问题

之前我在他的脚本中,记录了日志到一个.log中,我看了日志之后发现,无法renew的域名说是无法验证正确性。

因此我手动执行了一下 renew 脚本:

/usr/local/python/bin/certbot renew --renew-hook "/etc/init.d/nginx reload;/etc/init.d/httpd graceful" >> /data/https.log

依旧是一样的错误,秉着先解决问题的思路,直接给他强制更新:。

/usr/local/python/bin/certbot renew --force-renewal --renew-hook "/etc/init.d/nginx reload"

强制更新的时候发现,renew 失败的域名成功更新,但是一个没有到期的域名却失败,同样是验证错误。

1、 查看网站目录结构

一般来说都是.well-known的问题,但是问题的原因多种多样,我看了两个域名网站结构和目录,都没问题,应该是可以检查成功的。

2、服务器配置

然后我看了一下他的nginx的配置,(他使用的是 nginx 代理 到 apache),在看nginx的时候发现一个有趣的问题,他为了禁止使用http访问,设置了返回404

其中一个 .conf 配置如下(只显示有问题的部分):

if ($ssl_protocol = "") { return 404; }

这就很尴尬,一旦过期,则无法访问,并且renew的时候也无法验证成功(验证的时候,不会使用https访问,因此返回404是有问题的)

三、解决

其实一开始是秉着试试看的心态,我把 nginx 的两个 vhost 的 conf 配置都改了:

  if ($ssl_protocol = "") { return 301 https://$server_name$request_uri; }

然后进行renew 发现能够成功续费,而脚本执行也没有什么问题。