【问题标题】:How can i dynamically create new LetsEncrypt/Certbot SSL certificates for domains pointing to my server?如何为指向我的服务器的域动态创建新的 LetsEncrypt/Certbot SSL 证书?
【发布时间】:2019-08-18 16:48:20
【问题描述】:

我正在构建一个网络应用程序(例如:www.mywebapp.example),它允许用户将他们的域 - www.xyz.example - 指向 www.mywebapp.example。当用户转到www.xyz.example 时,他们的内容将改为从www.mywebapp.example 提供。用户将被告知如何在其域提供商 DNS 设置中更新其@www A records 以将www.xyz.example 连接到www.mywebapp.example

我可以使用./certbot-auto -d <domain-name> 为每个域手动创建新的 SSL 证书。我还设置了一个 cron 作业来测试更新。

但是,每次用户将其域连接到www.mywebapp.example 时,我想通过运行由 JavaScript 函数触发的 PHP 脚本来自动执行此过程。我的问题是:

  1. 我应该使用exec()/shell_exec() 命令从PHP 执行./certbot-auto 命令吗?我应该编写一个单独的 bash 脚本并运行 bash 脚本吗?

  2. 我是否应该使用 LetsEncrypt 推荐的 ACME PHP 库 - https://letsencrypt.org/docs/client-options/

  3. 我为域www.xyz2.example 手动创建了一个新的SSL 证书,它成功地指向了www.mywebapp.example。但是,这破坏了对所有现有域的 SSL 支持 - *.mywebapp.example, mywebapp.example, www.xyz.example。我是否需要为每个指向www.mywebapp.example 的域创建虚拟主机?

  4. 我需要编辑/etc/httpd/conf.d/ssl.conf 来添加新的虚拟主机吗?多个域可以使用相同的DocumentRoot 路径吗?

我已经阅读了以下所有链接,但仍然很困惑:

非常感谢任何帮助。如果需要更多信息,请告诉我。

我的服务器设置是:

  • AWS EC2

【问题讨论】:

    标签: php apache ssl lets-encrypt certbot


    【解决方案1】:

    你有很多问题。

    我应该使用 exec()/shell_exec() 命令从 PHP 执行 ./certbot-auto 命令吗?我应该编写一个单独的 bash 脚本并改为运行 bash 脚本吗?

    在一般情况下:否。

    一旦到达网页就会执行 PHP,因此它存在于当前 HTTP 会话中,而另一端的浏览器将等待某种响应,在某种有限的时间内(如果用户会生气他们没有看到“快”的东西)。

    如果你执行一些事情,你有两个选择:

    1. 您等待外部程序完成:问题,这可能是在“不确定”时间之后,因此如果不考虑这一点,用户将永远不会在浏览器中看到任何内容
    2. 你在后台启动它,并且你不等待它完成:问题,你不需要它是否成功,所以即使你能够回复“某事”给浏览器,你会怎么做处理故障?

    此类情况的通用解决方案是:

    1. HTTP 访问触发的操作只是记录请求,例如在数据库中或其他东西中
    2. 单独的一个进程轮询数据库以查找要执行的任务并执行它们;这与任何网络服务器完全分开;当作业完成(成功或失败)时,数据库将以相同的方式更新
    3. 1) 处的进程可以定期轮询 DB 以查看状态(待定或已完成或失败)并向用户显示消息,例如在其访问期间,具有某种自动刷新,和/或提供特定的单独用户可以在其中跟踪其操作状态的页面

    我是否应该使用 LetsEncrypt 推荐的 ACME PHP 库 - https://letsencrypt.org/docs/client-options/

    您可以使用任何能够正确实现 ACME 协议的语言的库。

    Let's Encrypt 只推荐一款软件:certbot。该页面中列出的所有其余部分都是预期可以工作的客户端库/程序的示例。

    我是否需要为每个指向 www.mywebapp.example 的域创建虚拟主机?

    是的,特别是如果他们每个人都使用一个特定的证书,否则网络服务器将无法根据浏览器提供的主机名(在 SNI 扩展内)识别在 TLS 握手开始时返回的正确证书在 TLS 握手开始时使用)

    或者你可以使用海量虚拟主机的一些Apache特性,比如https://httpd.apache.org/docs/2.4/mod/mod_vhost_alias.html 然而,这可能意味着添加了所有名称的单个证书,这在技术上可以工作直到一定数量的名称,但可能会产生非技术问题(例如查看所有名称等)

    当然,其他软件,如 Nging/HAProxy 可以提供更高级的功能,您不需要为每个虚拟主机配置虚拟主机,即使使用不同的证书,您只需使用特定命名将东西放在适当的位置,网络服务器就会根据需要匹配。

    我是否需要编辑 /etc/httpd/conf.d/ssl.conf 来添加新的虚拟主机?

    可以,或者任何其他文件,只要您使用 Include 或类似名称。

    如果您管理许多不同且独立的网站,则每个网站都有一个配置文件(包括其证书路径等)可能会更简单,许多 Linux 发行版安装 Apache 的方式是您拥有该功能的 /etc/httpd/sites-enabled/ .如果没有,你也可以自己做。

    多个域可以使用相同的 DocumentRoot 路径吗?

    当然可以。

    PS:请不要再说 SSL,这个协议叫 TLS,是 20 年前发明的。 SSL 早已不复存在,目前的建议是运行 TLS 1.2,除非有充分的理由也允许存在漏洞的 1.1 和 1.0。出于这个原因,也没有“SSL 证书”,因为它们用词不当。 TLS 可以在没有证书的情况下工作,并且这些证书可以在 TLS 之外使用,例如在 S/MIME 中。它们是 X.509 证书。

    【讨论】:

      猜你喜欢
      • 2017-02-23
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 2016-10-30
      • 2021-01-19
      • 1970-01-01
      相关资源
      最近更新 更多