是否可以使Apache使用PHP重新加载SSL证书,而无需shell访问?

时间:2016-11-14 15:54:52

标签: php apache ssl

我刚刚找到Let's Encrypt,同时寻找notorious StartSSL的替代方案,来管理我的DV SSL证书。由于LE证书是短期的,I'd like to使续订过程自动化。

我没有shell访问权限(只是cPanel),也没有来自我的托管服务提供商的内置LE支持,因此Certbot处于手动模式seems to be是唯一的出路。

我注意到了cPanel的/ssl/certs/目录,其中包含我的所有证书。现在我正在考虑运行一个获取新证书并覆盖过期证书的PHP脚本的Cron作业,但我不确定这是否可行,因为我需要让Apache重新加载被覆盖的证书。有可能,使用PHP吗?

2 个答案:

答案 0 :(得分:1)

手动获取证书

  

免责声明。 Letsencrypt says:我们不建议使用此选项,因为它非常耗时,并且您需要在证书过期时每年重复几次。对于大多数人来说,最好从您的托管服务提供商处请求Let's Encrypt支持,或者如果他们不打算实施它,请切换提供商。

     

免责声明2。我实际上无法访问cPanel服务器,因此我无法对此进行测试。可能有错误。请让我知道,我会纠正它们。

  1. 在本地计算机上安装certbot
  2. 生成质询回复:
    $ certbot certonly --manual -d example.com --test-cert --staging

    (注意:删除有效证书的--test-cert --staging
  3. 你应该看到类似的东西:
      

    确保您的网络服务器显示以下内容:   在继续之前http://example.com/.well-known/acme-challenge/VnHBr_PVGfhu-jdX0NCKrgAcCeC9A-HVqFjMOUAf24Y

         

    VnHBr_PVGfhu-jdX0NCKrgAcCeC9A-HVqFjMOUAf24Y.0l4s1uvmfEFHST9EqeW_AnsdrM7GmE0joLEjRGruG-8

  4. 根据需要手动创建文件并将其上传到您的webroot
  5. 返回计算机并按 Enter 继续
  6. 如果一切顺利,你应该有一个闪亮的新SSL证书。

    安装SSL服务器证书文件

    1. 登录cPanel
    2. 点击SSL / TLS管理器>证书(CRT)>生成,查看,上载或删除SSL证书
    3. 在“上载新证书”部分中,单击“浏览”按钮,然后找到您的SSL服务器证书文件。我认为这应该是/etc/letsencrypt/live/example.com/cert.pem
    4. 点击上传按钮。
    5. 单击“返回”链接返回“SSL / TLS管理器”。
    6. 注意:我在上述说明中没有看到有关如何处理私钥的内容,但是this site提到"上传新的私钥" 链接到某处。无论你想把私钥放在哪里。

      设置域

      1. 点击SSL / TLS管理器>设置SSL证书以使用您的站点。如果您无法使用此选项,则您的ISP可能已将其禁用,您需要与他们联系以完成SSL设置。
      2. 从“域”下拉菜单中选择将使用SSL证书的域。系统将尝试获取SSL证书和相应的私钥。
      3. 在记事本或其他简单文本编辑器(不是Word)中打开Letsencrypt中间密钥(/etc/letsencrypt/live/example.com/fullchain.pem)。将此文件的所有内容复制并粘贴到Ca Bundle(CABUNDLE)框中。
      4. 单击“安装证书”。您应该收到证书已成功安装的消息。如果您收到错误,可能需要与您的网络托管服务提供商联系以获得更多支持。
      5. 成功安装证书后,cPanel应重新启动/重新加载Web服务器,以使证书生效。

        改编自here

答案 1 :(得分:0)

这里要解决两个问题。首先,如何获得证书。第二,如何配置Web服务器以使用它。对于两者,我有两种不同的解决方案。

使用具有shell访问权限的计算机进行编排

假设您在自己的计算机上安装了certbot。我们还说,您可以通过SFTP访问您的网站空间。您可以使用sshfs挂载该Webspace并使用certbot自动获取证书:

#!/bin/sh

domain='example.org'

mkdir -p "/tmp/$domain"
sshfs "$domain:" "/tmp/$domain" -o nonempty
/opt/certbot/certbot-auto certonly --webroot -w "/tmp/$domain/public_html" -d "$domain"
# or later:
#/opt/certbot/certbot-auto renew
umount "/tmp/$domain"

现在您已获得或续订了证书。您可以使用Cpanel API将其安装在服务器上:

domain='example.org'
ledir="/etc/letsencrypt/live/$domain"
cabundle="$ledir/chain.pem"
crt="$ledir/cert.pem"
key="$ledir/privkey.pem"

cpanel_host='cpanel.example.com:2083'
cpanel_user=''

curl -u "$cpanel_user"\
 "$cpanel_host/json-api/cpanel?cpanel_jsonapi_apiversion=2&cpanel_jsonapi_module=SSL&cpanel_jsonapi_func=installssl&cpanel_jsonapi_user=$cpanel_user"\
 -d "domain=$domain" --data-urlencode "cabundle@$cabundle" --data-urlencode "crt@$crt" --data-urlencode "key@$key"

如果您使用自己的台式计算机,此解决方案可能不是完全自动化的。我喜欢这个解决方案,因为您不必在Web服务器上存储Cpanel帐户的管理员密码。您还可以控制证书获取过程和密钥。

在服务器上使用用户空间ACME客户端

有acme.sh并且有Acme PHP和其他允许您从服务器获取证书。我的托管服务提供商允许我运行cron作业,以便我可以运行acme.sh来获取证书。我不确定我是否也可以通过它访问Cpanel的uapi命令行工具。否则,您可以使用具有libcurl支持的纯PHP应用程序来使用与上面相同的API调用来安装证书。那将是完全自动化的,但我还没有测试过。