在一台主机上的 Apache2 上同时提供 https://example.com 和 www.example.com 服务时遇到问题

问题描述

我在 AWS 上的 Ubuntu 机器上为我的网站(Angular App)提供服务。我的域名 example.com 已在 GoDaddy 上注册。我的网站在 AWS 上提供服务。我已将 GoDaddy 上的名称服务器设置为指向 AWS Route53 托管区域。在 Route53 上,我有一个 example.com 的 A 记录以及 TXT 记录。我正在为我的 ssl 证书使用 Let's Encrypt。我正在使用 Apache2 来为我的网站提供服务。我的 https://example.com 在所有浏览器上都能正常工作。

我在 Route53 上创建了 CNAME 记录 www.example.com 以将流量路由到 example.com。 https://www.example.com 在 Chrome(和 Edge)上运行良好。但是,如果 https://example.com 未缓存,Safari 和 Firefox 会抱怨“找不到站点”。如果它被缓存,它会抱怨“连接不是私有的”。

我尝试了不同的配置:

  1. 在 httpd.conf 中使用 ServerAlias
  2. www.example.com 配置单独的 VirtualHost,为 example.com 配置单独的 VirtualHost
  3. 两个独立的托管区域,一个用于 example.com,另一个用于 www.example.com

解决方法

我终于解决了这个问题。问题在于生成的证书。

最初我试图生成两个证书,一个是 example.com,另一个是 www.example.com。 当我尝试访问 www.example.com 时的实际错误是:SSL_ERROR_BAD_CERT_DOMAIN,当我进一步深入时,我注意到提供的证书是 example.com。在基于 Chrome 的浏览器上,它会切换到 example.com,一切都很愉快。但是,Safari 和 Firefox 没有这样做,而且是错误的。由于证书不可读,因此很难从证书本身中找出答案。

我所做的修复是生成一个证书,该证书扩展以同时兑现:

sudo certbot --server https://acme-v02.api.letsencrypt.org/directory -d example.com -d www.example.com  --manual --preferred-challenges dns-01 certonly