你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

了解 Azure Database for PostgreSQL 单一服务器的根 CA 更改中的更改

适用于:Azure Database for PostgreSQL 单一服务器

重要

Azure Database for PostgreSQL - 单一服务器即将停用。 强烈建议升级到 Azure Database for PostgreSQL 灵活服务器。 有关迁移到 Azure Database for PostgreSQL 灵活服务器的详细信息,请参阅 Azure Database for PostgreSQL 单一服务器的最新动态

Azure Database for PostgreSQL 单一服务器计划自 2022 年 12 月 (2022/12) 开始的根证书更改,作为标准维护和安全最佳做法的一部分。 本文提供了有关更改、受影响的资源的更多详细信息,以及确保应用程序始终与数据库服务器连接所需执行的步骤。

为什么需要更新根证书?

过去,Azure Database for PostgreSQL 用户只能使用预定义的证书来连接其位于此处的 PostgreSQL 服务器。 但是,证书颁发机构 (CA) 浏览器论坛最近发布的报告表明,由 CA 供应商颁发的多个证书不符合标准。

根据行业的合规性要求,CA 供应商已开始吊销不符合标准的 CA 的 CA 证书,要求服务器使用由符合标准的 CA 颁发的证书,并由这些符合标准的 CA 颁发的 CA 证书进行签名。 由于 Azure Database for PostgreSQL 使用其中一个不符合标准的证书,因此我们需要将证书轮换到合规版本,以最大程度减少对 PostgreSQL 服务器的潜在威胁。

新证书已推出,自 2022 年 12 月 (2022/12) 起生效。

计划从 2022 年 12 月 (2022/12) 开始执行哪些更改?

从 2022 年 12 月开始,BaltimoreCyberTrustRoot 根证书会替换为名为 DigiCertGlobalRootG2 根证书兼容版本。 如果应用程序利用 verify-caverify-full 作为数据库客户端连接中 sslmode 参数的值,则需要按照说明将新证书添加到证书存储以保持连接。

我是否需要在客户端上进行任何更改以维护连接?

客户端上无需更改代码或应用程序。 如果遵循以下证书更新建议,则只要未从组合的 CA 证书中移除 BaltimoreCyberTrustRoot 证书,就仍然可以继续连接。 在收到有关维护连接的进一步通知之前,建议不要从组合的 CA 证书中删除 BaltimoreCyberTrustRoot。

我需要对客户端证书进行任何更改吗

默认情况下,PostgreSQL 不会对服务器证书执行任何验证。 这意味着理论上仍然可以在客户端不知情的情况下欺骗服务器标识(例如通过修改 DNS 记录或接管服务器 IP 地址)。 为了防止任何可能的欺骗,必须在客户端上使用 SSL 证书验证。 可以通过应用程序客户端连接字符串 ssl 模式值 - verify-ca 或 verify-full 来设置此类验证。 如果选择了这些 ssl 模式值,则应按照下一部分中的说明进行操作。

客户端证书更新建议

  • 从以下链接下载 BaltimoreCyberTrustRoot 和 DigiCertGlobalRootG2 根 CA:

  • (可选)为了防止将来的中断,还建议将以下根添加到受信任的存储:

  • 生成组合的 CA 证书存储,其中同时包含 BaltimoreCyberTrustRootDigiCertGlobalRootG2 证书。

    • 对于使用 DefaultJavaSSLFactory 的 Java (PostgreSQL JDBC) 用户,请执行:

      keytool -importcert -alias PostgreSQLServerCACert  -file D:\BaltimoreCyberTrustRoot.crt.pem  -keystore truststore -storepass password -noprompt
      
      keytool -importcert -alias PostgreSQLServerCACert2  -file D:\DigiCertGlobalRootG2.crt.pem -keystore truststore -storepass password  -noprompt
      

      然后,将原始密钥存储文件替换为新生成的密钥存储文件:

      • System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file");
      • System.setProperty("javax.net.ssl.trustStorePassword","password");
    • 对于 Windows 上的 .NET (Npgsql) 用户,请确保 Baltimore CyberTrust 根和 DigiCert 全局根 G2 都存在于 Windows 证书存储“受信任的根证书颁发机构”中 。 如果有任何证书不存在,请导入缺失的证书。

      Azure Database for PostgreSQL .net 证书

    • 对于 Linux 上使用 SSL_CERT_DIR 的 .NET (Npgsql) 用户,请确保 BaltimoreCyberTrustRoot 和 DigiCertGlobalRootG2 都存在于 SSL_CERT_DIR 指示的目录中 。 如果有任何证书不存在,请创建缺失的证书文件。

    • 对于其他 PostgreSQL 客户端用户,你可以按以下格式合并两个 CA 证书文件


      -----证书开始-----
      (根 CA1:BaltimoreCyberTrustRoot.crt.pem)
      -----证书结束-----
      -----证书开始-----
      (根 CA2:DigiCertGlobalRootG2.crt.pem)
      -----证书结束-----

  • 将原始根 CA pem 文件替换为组合的根 CA 文件,然后重启应用程序/客户端。

  • 将来,在服务器端部署新证书后,可以将 CA pem 文件更改为 DigiCertGlobalRootG2.crt.pem。

注意

在证书更改完成之前,请勿删除或更改 Baltimore 证书。 更改完成后,我们会发送通信,之后用户便可以安全地删除 Baltimore 证书。

如果删除了 BaltimoreCyberTrustRoot 证书会怎么样?

在连接到 Azure Database for PostgreSQL 服务器时,可能会开始出现连接错误。 需要使用 BaltimoreCyberTrustRoot 证书再次配置 SSL 以保持连接。

常见问题

1.如果我不使用 SSL/TLS,是否仍需要更新根 CA?

如果你不使用 SSL/TLS,则无需执行任何操作。

2.如果我使用 SSL/TLS,是否需要重启数据库服务器来更新根 CA?

不需要,你无需重启数据库服务器即可开始使用新证书。 这是客户端更改,传入的客户端连接需要使用新证书来确保它们可以连接到数据库服务器。

3.如何知道是否使用 SSL/TLS 进行根证书验证?

通过查看连接字符串,可以确定连接是否验证根证书。

  • 如果你的连接字符串包含 sslmode=verify-casslmode=verify-full,则你需要更新证书。
  • 如果你的连接字符串包含 sslmode=disablesslmode=allowsslmode=prefersslmode=require,则你不需要更新证书。
  • 如果你的连接字符串未指定 sslmode,则不需要更新证书。

如果你使用的客户端将连接字符串提取出来,请查看客户端的文档,以了解它是否验证证书。 要了解 PostgreSQL sslmode,请查看 PostgreSQL 文档中的 SSL 模式说明

4.如果将应用服务与 Azure Database for PostgreSQL 一起使用,会产生什么影响?

对于连接到 Azure Database for PostgreSQL 的 Azure 应用服务,可以采用两种可能的方案,具体取决于你在应用程序中使用 SSL 的方式。

  • 此新证书已在平台级别添加到应用服务。 如果你在应用程序中使用应用服务平台上包含的 SSL 证书,则无需执行任何操作。
  • 如果你在代码中显式包含 SSL 证书文件的路径,则需要下载新证书并更新代码以使用新证书。这种情况的一个很好的示例是在应用服务中使用自定义容器,如应用服务文档中所述

5.如果将 Azure Kubernetes 服务 (AKS) 与 Azure Database for PostgreSQL 一起使用,会产生什么影响?

如果尝试使用 Azure Kubernetes 服务 (AKS) 连接到 Azure Database for PostgreSQL,其方法类似于从专用客户主机环境进行访问。 请参考此处的步骤。

6.使用 Azure 数据工厂连接到 Azure Database for PostgreSQL 会产生什么影响?

对于使用 Azure Integration Runtime 的连接器,连接器在 Azure 托管的环境中利用 Windows 证书存储中的证书。 这些证书已与新应用的证书兼容,因此不需要执行任何操作。

对于使用自承载集成运行时的连接器(可在连接字符串中显式包含 SSL 证书文件的路径),需要下载新证书并更新连接字符串才能使用该证书。

7.是否需要为此更改计划数据库服务器维护停机时间?

否。 由于此处的更改仅发生在要连接到数据库服务器的客户端,因此数据库服务器不需要维护停机时间来进行此更改。

8. 如果我在 2022 年 11 月 30 日之后创建新的服务器,我是否会受影响?

对于在 2022 年 11 月 30 日之后创建的服务器,你将继续使用 BaltimoreCyberTrustRoot 以及数据库客户端 SSL 证书存储中的新 DigiCertGlobalRootG2 根证书,以便应用程序使用 SSL 进行连接。

9.Microsoft 更新其证书的频率是多少?或者说过期策略是怎样的?

Azure Database for PostgreSQL 使用的这些证书是由受信任的证书颁发机构 (CA) 提供的。 因此,这些证书的支持与 CA 对这些证书的支持相关联。 BaltimoreCyberTrustRoot 证书计划于 2025 年停用,因此,Microsoft 需要在到期前执行证书更改。 此外,如果这些预定义证书中存在未预见的 bug,Microsoft 将需要尽早执行证书轮换(类似于在 2021 年 2 月 15 日执行的更改),以确保服务始终安全且合规。

10. 如果我使用的是只读副本,是否只需在主服务器或只读副本上执行此更新?

由于此更新是客户端更改,因此,如果客户端过去从副本服务器读取数据,则还需要对这些客户端应用更改。

11.是否有服务器端查询可用来验证是否正在使用 SSL?

若要验证是否正在使用 SSL 连接来连接到服务器,请参阅 SSL 验证

12.如果我的证书文件中已有 DigiCertGlobalRootG2,是否需要执行任何操作?

否。 如果你的证书文件已经有 DigiCertGlobalRootG2,则无需执行任何操作。

13. 如何检查服务器发送的证书?

有许多工具可供你使用。 例如,DigiCert 具有一种便捷的工具,可显示任何服务器名称的证书链。 (此工具仅适用于可公开访问的服务器;它无法连接到包含在虚拟网络 [VNET] 中的服务器)。 可以使用的另一种工具是命令行中的 OpenSSL,可以使用以下语法来检查证书:

openssl s_client -starttls postgres -showcerts -connect <your-postgresql-server-name>:5432

14.如果我有其他问题,该怎么办?

如果有疑问,请从 Microsoft Q&A 中的社区专家那里获取解答。 如有支持计划并需要技术帮助,请创建支持请求

  • 对于“问题类型”,选择“技术” 。
  • 对于“订阅”,请选择自己的订阅。
  • 对于“服务”,选择“我的服务”,然后选择“Azure Database for PostgreSQL - 单一服务器”。
  • 对于“问题类型”,请选择“安全”。
  • 对于“问题子类型”,请选择“Azure 加密和基础结构双重加密”