我正在尝试为我的网站和电子邮件服务上使用的域获取新证书。是否有可能为Apache和电子邮件服务续订证书而不重新启动它们?
为此,我使用Certbot作为客户端程序连接到执行证书创建的LetsEncrypt。
我看过的每个教程都没有指出任何更新证书而不重新启动Web(如Apache)或电子邮件服务的方法。
有谁知道如何做到这一点?
我正在尝试为我的网站和电子邮件服务上使用的域获取新证书。是否有可能为Apache和电子邮件服务续订证书而不重新启动它们?
为此,我使用Certbot作为客户端程序连接到执行证书创建的LetsEncrypt。
我看过的每个教程都没有指出任何更新证书而不重新启动Web(如Apache)或电子邮件服务的方法。
有谁知道如何做到这一点?
的certbot文档描述了获得证书,而无需重新启动Web服务器,使用Web根目录插件的方法:https://certbot.eff.org/docs/using.html#webroot
总之,你需要一些额外的参数传递给certbot命令续订:certonly
,--webroot
和--webroot-path
或-w
。因此,完整的命令会是这个样子:
certbot renew certonly --webroot -w /var/www/example/ -d www.example.com
根据文档:
的根目录插件的工作原理是在$创建为每个请求的域的临时文件{webroot的路径} /.well-known/acme-challenge。然后,Let's Encrypt验证服务器使HTTP请求验证每个请求域的DNS解析为运行certbot的服务器。
这让咱们加密,而不停止Apache绑定到端口80,443执行域验证等
对于Apache 2.4:“apachectl graceful”(又名“reload”)为我重新加载证书(使用2.4.18-2ubuntu3在ubuntu 16.04上测试过)。 需要注意的是:网上有很多信息表明apache需要完全重新启动,而不是重新加载才能接受新的证书。因为对我来说,优雅的重新加载已经足够了,我会说这是可能的,也许甚至有可能对于较旧的apache版本而言,需要一次以上的重新加载?
您可以制作一个脚本,首先进行certbot续订,然后apachectl优雅。或者只有2个cronjobs,其中apachectl优雅发生在certbot cronjob之后。
尽管恕我直言,这个问题并没有那么严重:Letsencrypt会在到期前的30天内续签证书。我个人更经常地重启我的服务器,因为我的每周运行的ubuntu autoupdater在“/etc/apt/apt.conf.d/50unattended-upgrades”配置为“无人值守升级::自动重启”true;“”而且它没有更新的机会使得它想要在整整30天内重新启动,这种可能性非常低。
如果你不想重新启动,你必须检查你的其他服务(如果你在服务器上也有邮件,你可以想一想你的其他服务(想到postfix,dovecot)他们需要接受一个新证书,然后把它添加到您的脚本启动“certbot续订”。
Certbot有一个内置的命令来更新你所有的证书:
certbot renew certonly --webroot -w /var/www/example/ -d www.example.com
如果您想在创建证书后重新加载配置,只需运行sudo service nginx reload
或sudo service apache2 reload
。这将重新加载配置,而无需重新启动(因此无需停机)您的网站。
我使用此方法通过cronjob自动更新我的Let's Encrypt SSL证书,但它也适用于certbot。欲了解更多详情,请参阅Automatically renew Let's Encrypt SSL certificate
重新加载Apache不会使它使用新的证书,您需要重新启动。 – magnetik
过了一段时间,我得到了这个答案。但是现在我遇到了一些麻烦:我不希望通过HTTP使用我的网站。 webroot需要通过HTTP执行挑战。您是否知道在不停止或重新启动Apache的情况下使用HTTPS执行挑战的另一种方法? –
@HugoFonseca如果我正确理解你的问题,应该只允许HTTP连接到$ {webroot-path} /。知名/ acme-challenge中的临时文件,同时仍然需要HTTPS用于其他站点。我可以想象在服务器配置中有几种方法可以做到这一点,也许最简单的可能是.htaccess文件中的URL重写规则。这取决于您希望如何为网站的其他部分强制使用HTTPS,但实际上您只需为该目录创建一个例外。 –