多域通配符 SSL 映射多个 Azure App Service 应用

Multi-domain wildcard SSL mapping multiple Azure App Service apps

我有以下(计划)设置:

  1. 网站:domain.com(在 GoDaddy 上托管的 Wordpress 页面,标准 SSL 已启用证书)
  2. API: x.domain.com 通过 CNAME 条目指向 x.azurewebsites.net
  3. 客户端 1:a.x.domain.com(客户端 1)通过 CNAME 条目指向 a.azurewebsites.net
  4. 客户端 2:b.x.domain.com(客户端 2)通过 CNAME 条目指向 b.azurewebsites.net
  5. 客户端 3:c.x.domain.com(客户端 3)通过 CNAME 条目指向 c.azurewebsites.net

由于 Safari 有更严格的 cookie 政策(与 Chrome、FF、Edge 相比),我们需要在同一域中托管 API,并在各自的子域中托管客户端,因此计划的步骤 2-5.

我们有 4 个 (x,a,b,c) Azure (linux) 应用程序服务 运行ning。每一个都被分成一个暂存和生产环境(相同的实例,不同的域)。

Azure Web App 服务中的 CNAME aliases and mapping custom domains 已经可以使用了。 A记录IP依然指向Wordpress网站

下一步是bind the necessary SSL certificates。在这里,我确定了不同的选项,但我不确定哪个可行,哪个是 recommended/best 选项:

选项 1:GoDaddy 支持建议购买 8 个标准 SSL 证书(4 个服务 * 2 个用于暂存和生产)。这对我来说听起来有点矫枉过正,而且可能是最昂贵但最灵活的解决方案。

选项 2:我们购买第二个域(例如 domain2.com),运行 API x,并分配客户 1 -3 (a.domain2.com, b.domain2.com, c.domain2.com) 作为一级子域。 (2.1) 那么,一个通配符SSL证书真的可以在多个Azure实例中使用吗? (2.2) 由于严格的 Safari cookie 策略要求 API 是比客户端更高的域级别,我们需要第三个域(+ 证书)来暂存(除生产之外)......或者可以multi-domain wildcard SSL certificate 允许这种情况吗?

选项 3:如果问题 2.1 的答案是 "no",我们或许可以将 4 个 Azure Web 应用程序合并到一个 Kubernetes 集群中,然后使用同一实例内的 2 个通配符 SSL 证书(1 个暂存,1 个生产)。

选项 4:我已经成功地将 Let's encrypt 用于几个私人网站,但对于将它们用于商业服务有点犹豫。 Azure 有一个 inofficial extension 来管理和扩展 Let's encrypt 证书。这也是我们应该考虑的事情吗?有什么缺点?

就我个人而言,我认为选项 2 是最好的,因为它不需要重新配置我们的服务(如选项 3)。请记住,该网站(根域)不是托管在 Azure 上;尽管如有必要,我们可以将其移至 Azure。

或者我是否缺少第 5 个选项?

您缺少一个选项。

只要 x 在您的情况下是静态的,那么您可以获得 *.x.domain.com 的单个通配符证书。

GoDaddy 肯定会推荐购买四个单独的证书,在某种程度上我不怪他们。对多个端点使用通配符证书是否合适实际上取决于许多因素。必须意识到的是,当有多个不同的服务器时,使用相同的密钥加密客户端-服务器通信的安全问题,如果在多个不同的服务器上使用证书的私钥,那么密钥泄露的范围可能会扩大具有各种大小和地形的攻击面。攻陷一台服务器,秘钥全攻陷

在您的例子中,您将仅在 Azure 中使用证书,因此所有应用程序都有一个共同的攻击面。因此,使用通配符证书是可以的。

如果 x 和底层主机名一样是可变的,那你就不走运了。 RFC 6125 要求证书验证客户端仅评估在最左侧(底部)域名部分使用通配符。例如。 *.x.domain.com 有效,但 a.*.domain.com 无效。

Let's Encrypt 由业内一些最大的参与者赞助。如果您能够通过自动化克服短暂的有效期,那么我强烈推荐它们。它们现在受到所有主要浏览器和操作系统的信任。我已经通过 PowerShell 自动化在 Azure 中托管我的 DNS 取得了成功。如果您的根域属于第三方,您可能需要考虑为 x.domain.com 创建一个 DNS 区域,并在指向您的 Azure 区域名称服务器的第三方 DNS 提供商中为存根创建 NS 记录。

尽管架构师 Jamie 发布了一个非常有用的答案并且我已经准备好实施 Let's encrypt-方法,但我只是发现微软实际上发布了一个本地选项:

应用服务托管证书(预览版),为应用服务托管应用提供免费证书选项。可以在 Microsoft Azure Docs.

上找到详细信息