Firebase 托管生成的 SSL 证书不包括连接的域
SSL certificate generated by Firebase Hosting does not include connected domain
上周我们遇到过两次这个问题。对于具有两个连接域的 Firebase 托管项目,证书中不包含一个域。
尝试与浏览器连接似乎 return 503 状态代码并且 Chrome 在控制台中显示 net::ERR_CERT_COMMON_NAME_INVALID
。 curl
returns
(51) SSL: no alternative certificate subject name matches target host name '{host}'
(其中 {host}
是主机名/连接域)
要直接检查证书,即 SANs,我使用以下命令:
gnutls-cli --print-cert ${host} < /dev/null \
| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' \
| openssl x509 -noout -text \
| grep DNS | tr , '\n' | tr -s " "
这是一个包含 100 个证书的列表,其中包括工作域的主机名,但只有失败域的默认 firebaseapp.com/*.firebaseapp.com 条目。
注意:我这里用的是gnutls-cli
,因为好像openssl s_client -connect ${host}:443
在请求中没有包含主机名,总是加载[=39=的证书]/*.firebaseapp.com
我已经联系了 Firebase 支持,但他们的最后回复(~16 小时前)是 "there are two different domains associated to the same project, but I need to confirm if this is supported"。我很确定这是支持的,因为在我分析问题的过程中,我发现在我们负责的域旁边有超过 400 个相同的两个主机名的 SAN。
关于我们如何解决这个问题有什么建议吗?我已经尝试删除并重新添加自定义域,但这并没有改变任何东西。
从技术上讲,切换托管不会太困难,但我们的主要问题是 DNS 由我们客户的服务提供商控制,他们很难更改已经在生产中的任何内容。
在与 Firebase 支持人员反复沟通后,他们发现根域包含 CAA record,但不包含 letsencrypt.org.
我们特定情况下的修复是仅包含子域的 let's encrypt。例如,使用以下设置
- 域:
awesomesite.com
- 连接域:
firebaseapp.awesomesite.com
我们可以使用 dig 查询记录:
$ dig CAA awesomesite.com +noall +answer && dig CAA firebaseapp.awesomesite.com +noall +answer
; <<>> (...) <<>> CAA awesomesite.com +noall +answer
;; global options: +cmd
awesomesite.com. 299 IN CAA 0 iodef "mailto:cert@awesomesite.com"
awesomesite.com. 299 IN CAA 0 issue "digicert.com"
; <<>> (...) <<>> CAA firebaseapp.awesomesite.com +noall +answer
;; global options: +cmd
firebaseapp.awesomesite.com. 3599 IN CAA 0 issue "letsencrypt.org"
如您所见,域 firebaseapp.awesomesite.com
有一个 CAA 记录 letsencrypt.org,而 awesomesite.com
没有被触及。
现在一切正常,更新记录后不久。我们不必在 Firebase 托管或 delete/add 连接的域上重新触发部署(我之前曾尝试解决该问题)。
解决问题的备选方案:
- 删除CAA记录:从根域(或中间域)中删除CAA记录。
- 扩展CAA记录:在根域的CAA记录中的域列表中包含letsencrypt.org
2020 年 9 月更新:根据我收到的一封电子邮件,Google 正在将 SSL 证书提供商迁移到新的 Google-运行 CA 因为 Let's Encrypt's transition to ISRG's Root 可能会破坏向后兼容性。根据该电子邮件,需要使用 pki.goog
的额外 CAA:
firebaseapp.awesomesite.com. 3599 IN CAA 0 issue "pki.goog"
firebaseapp.awesomesite.com. 3599 IN CAA 0 issue "letsencrypt.org"
对于您的自定义域,如果您的 DNS 记录具有指向其他提供商的 A 记录或 CNAME 记录,则 Firebase 无法提供 SSL 证书。
上周我们遇到过两次这个问题。对于具有两个连接域的 Firebase 托管项目,证书中不包含一个域。
尝试与浏览器连接似乎 return 503 状态代码并且 Chrome 在控制台中显示 net::ERR_CERT_COMMON_NAME_INVALID
。 curl
returns
(51) SSL: no alternative certificate subject name matches target host name '{host}'
(其中 {host}
是主机名/连接域)
要直接检查证书,即 SANs,我使用以下命令:
gnutls-cli --print-cert ${host} < /dev/null \
| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' \
| openssl x509 -noout -text \
| grep DNS | tr , '\n' | tr -s " "
这是一个包含 100 个证书的列表,其中包括工作域的主机名,但只有失败域的默认 firebaseapp.com/*.firebaseapp.com 条目。
注意:我这里用的是gnutls-cli
,因为好像openssl s_client -connect ${host}:443
在请求中没有包含主机名,总是加载[=39=的证书]/*.firebaseapp.com
我已经联系了 Firebase 支持,但他们的最后回复(~16 小时前)是 "there are two different domains associated to the same project, but I need to confirm if this is supported"。我很确定这是支持的,因为在我分析问题的过程中,我发现在我们负责的域旁边有超过 400 个相同的两个主机名的 SAN。
关于我们如何解决这个问题有什么建议吗?我已经尝试删除并重新添加自定义域,但这并没有改变任何东西。
从技术上讲,切换托管不会太困难,但我们的主要问题是 DNS 由我们客户的服务提供商控制,他们很难更改已经在生产中的任何内容。
在与 Firebase 支持人员反复沟通后,他们发现根域包含 CAA record,但不包含 letsencrypt.org.
我们特定情况下的修复是仅包含子域的 let's encrypt。例如,使用以下设置
- 域:
awesomesite.com
- 连接域:
firebaseapp.awesomesite.com
我们可以使用 dig 查询记录:
$ dig CAA awesomesite.com +noall +answer && dig CAA firebaseapp.awesomesite.com +noall +answer
; <<>> (...) <<>> CAA awesomesite.com +noall +answer
;; global options: +cmd
awesomesite.com. 299 IN CAA 0 iodef "mailto:cert@awesomesite.com"
awesomesite.com. 299 IN CAA 0 issue "digicert.com"
; <<>> (...) <<>> CAA firebaseapp.awesomesite.com +noall +answer
;; global options: +cmd
firebaseapp.awesomesite.com. 3599 IN CAA 0 issue "letsencrypt.org"
如您所见,域 firebaseapp.awesomesite.com
有一个 CAA 记录 letsencrypt.org,而 awesomesite.com
没有被触及。
现在一切正常,更新记录后不久。我们不必在 Firebase 托管或 delete/add 连接的域上重新触发部署(我之前曾尝试解决该问题)。
解决问题的备选方案:
- 删除CAA记录:从根域(或中间域)中删除CAA记录。
- 扩展CAA记录:在根域的CAA记录中的域列表中包含letsencrypt.org
2020 年 9 月更新:根据我收到的一封电子邮件,Google 正在将 SSL 证书提供商迁移到新的 Google-运行 CA 因为 Let's Encrypt's transition to ISRG's Root 可能会破坏向后兼容性。根据该电子邮件,需要使用 pki.goog
的额外 CAA:
firebaseapp.awesomesite.com. 3599 IN CAA 0 issue "pki.goog"
firebaseapp.awesomesite.com. 3599 IN CAA 0 issue "letsencrypt.org"
对于您的自定义域,如果您的 DNS 记录具有指向其他提供商的 A 记录或 CNAME 记录,则 Firebase 无法提供 SSL 证书。