我正在构建一个Web应用程序(示例: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脚本来自动执行此过程。我的问题是:
是否应该使用./certbot-auto
命令从PHP执行exec()/shell_exec()
命令?我应该编写一个单独的bash脚本并改为运行bash脚本吗?
我应该使用LetsEncrypt推荐的ACME PHP库-https://letsencrypt.org/docs/client-options/
我为域www.xyz2.example
手动创建了一个新的SSL证书,该证书成功指向www.mywebapp.example
。但是,这破坏了对所有现有域-*.mywebapp.example, mywebapp.example, www.xyz.example
的SSL支持。我是否需要为每个指向www.mywebapp.example
的域创建虚拟主机?
/etc/httpd/conf.d/ssl.conf
来添加新的虚拟主机吗?多个域可以使用相同的DocumentRoot
路径吗?我已经阅读了以下所有链接,但仍然很困惑:
任何帮助将不胜感激。如果需要更多信息,请告诉我。
我的服务器设置为:
答案 0 :(得分:1)
一个问题中有很多问题。
是否应该使用exec()/ shell_exec()命令从PHP执行./certbot-auto命令?我应该编写一个单独的bash脚本并改为运行bash脚本吗?
在一般情况下:否。
一旦到达网页,便会执行PHP,因此它将驻留在当前的HTTP会话中,并且另一端的浏览器将在某种有限的时间内等待某种形式的响应(如果这样,用户会生气他们看不到出现“快速”的东西。)
如果执行事务,则有两个选择:
此类情况的通用解决方案是:
我应该使用LetsEncrypt推荐的ACME PHP库-https://letsencrypt.org/docs/client-options/
您可以使用任何语言来正确实现ACME协议。
我们的加密仅推荐一种软件:certbot
。该页面中列出的所有其余示例都是预期会起作用的客户端库/程序的示例。
我是否需要为每个指向www.mywebapp.example的域创建虚拟主机?
是的,特别是如果他们正在使用每个证书中的特定证书,否则Web服务器将无法根据浏览器给出的主机名(在SNI扩展名之内)识别出正确的证书以在TLS握手开始时返回在TLS握手开始时使用)
或者您可以使用大量虚拟主机的某些Apache功能,例如https://httpd.apache.org/docs/2.4/mod/mod_vhost_alias.html 但是,按原样,这可能意味着添加了所有名称的单个证书,该证书在技术上可以使用到一定数量的名称,但是会造成非技术性的问题(例如查看所有名称等)
当然,其他软件(例如Nging / HAProxy)可以提供更高级的功能,您无需为每个虚拟主机配置虚拟主机,即使使用不同的证书,也只需使用特定的命名将其放置在适当的位置,Web服务器将根据需要进行匹配。
我需要编辑/etc/httpd/conf.d/ssl.conf来添加新的虚拟主机吗?
是的,或任何其他文件,只要您使用Include
或类似的文件即可。
如果您管理许多不同的网站,则每个网站只有一个配置文件(包括其证书路径等)可能会更简单,许多Linux发行版都以/etc/httpd/sites-enabled/
的方式安装Apache。该功能。如果没有,您可以自己做。
多个域可以使用相同的DocumentRoot路径吗?
当然可以。
PS:请别再说SSL,该协议名为TLS,是20年前发明的。 SSL已经不复存在,当前的建议是运行TLS 1.2,除非有充分的理由允许同时存在漏洞的1.1和1.0。出于这个原因并且因为它们是错误的名称,所以没有“ SSL证书”。 TLS可以在没有证书的情况下工作,并且这些证书可以在TLS之外使用,例如在S / MIME中。它们是X.509证书。