更新应用程序客户端证书

将应用程序连接到Azure Database for PostgreSQL时,应用程序客户端必须安装受信任的根证书。 以下部分将指导你更新应用程序的受信任根证书,这是连接到Azure Database for PostgreSQL灵活服务器实例的应用程序的常见方案。

重要

Microsoft正在更新Azure Database for PostgreSQL的TLS证书,以轮换证书颁发机构和更新的证书链。

如果客户端 配置使用 TLS 的建议配置,则无需执行作。

根证书轮换计划:

  • 从 2026 年 3 月 9 日起,针对中国区域的根 CA 证书,将从 DigiCert 全球根 CA (G1) 更新为 DigiCert 全球根 G2。

在客户端的 Java 密钥库中导入根 CA 证书,以便用于证书绑定场景

自定义编写的 Java 应用程序使用默认密钥存储(称为 cacerts),其中包含受信任的证书颁发机构 (CA) 证书。 它通常也称为 Java 信任库。 名为 cacerts 证书文件的驻留在安全属性目录 java.home\lib\security 中,其中 java.home 是运行时环境目录( jre SDK 中的目录或 Java™ 2 运行时环境的顶级目录)。 可以使用以下说明通过 PostgreSQL 更新客户端证书固定方案的客户端根 CA 证书:

  1. 检查 cacerts java 密钥存储,查看它是否已包含所需的证书。 可以使用以下命令列出 Java 密钥存储中的证书:

      keytool -list -v -keystore ..\lib\security\cacerts > outputfile.txt
    

    如果客户端上的 java 密钥存储中没有必要的证书,可以在输出中检查到,您应该按照以下说明进行操作:

  2. 创建自定义密钥存储的备份副本。

  3. 下载 证书,并将其保存在本地,你可以在其中引用它们。

  4. 生成包含所有所需根 CA 证书的合并 CA 证书存储。 下面的示例演示 PostgreSQL JDBC 用户如何使用 DefaultJavaSSLFactory。

        keytool -importcert -alias PostgreSQLServerCACert  -file D:\ DigiCertGlobalRootG2.crt.pem   -keystore truststore -storepass password -noprompt
    
        keytool -importcert -alias PostgreSQLServerCACert2  -file "D:\ Microsoft ECC Root Certificate Authority 2017.crt.pem" -keystore truststore -storepass password  -noprompt
    
        keytool -importcert -alias PostgreSQLServerCACert  -file D:\ DigiCertGlobalRootCA.crt.pem   -keystore truststore -storepass password -noprompt
    
  5. 将原始密钥存储文件替换为新生成的密钥存储文件:

    System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file");
    System.setProperty("javax.net.ssl.trustStorePassword","password");
    
  6. 将原始根 CA pem 文件替换为合并的根 CA 文件并重启应用程序/客户端。

    有关使用 PostgreSQL JDBC 驱动程序配置客户端证书的详细信息,请参阅 本文档

    注释

    若要将证书导入客户端证书存储,可能需要将证书 .crt 文件转换为 .pem 格式。 可以使用 OpenSSL 实用工具进行这些文件转换

以编程方式获取 Java 密钥存储中受信任的证书列表

默认情况下,Java 将受信任的证书存储在客户端上的 Java 安装文件夹中的特殊 cacerts 文件中。 下面的示例首先读取 cacerts 并将其加载到 KeyStore 对象中:

private KeyStore loadKeyStore() {
    String relativeCacertsPath = "/lib/security/cacerts".replace("/", File.separator);
    String filename = System.getProperty("java.home") + relativeCacertsPath;
    FileInputStream is = new FileInputStream(filename);
    KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
    String password = "changeit";
    keystore.load(is, password.toCharArray());

    return keystore;
}

默认密码 cacertschangeit ,但在实际客户端上应有所不同,因为管理员建议在 Java 安装后立即更改密码。 加载 KeyStore 对象后,可以使用 PKIXParameters 类读取存在的证书。

public void whenLoadingCacertsKeyStore_thenCertificatesArePresent() {
    KeyStore keyStore = loadKeyStore();
    PKIXParameters params = new PKIXParameters(keyStore);
    Set<TrustAnchor> trustAnchors = params.getTrustAnchors();
    List<Certificate> certificates = trustAnchors.stream()
      .map(TrustAnchor::getTrustedCert)
      .collect(Collectors.toList());

    assertFalse(certificates.isEmpty());
}

在 Azure 应用服务中使用客户端时更新根 CA 证书,以用于证书绑定方案。

对于 Azure 应用服务,将应用程序连接到 Azure Database for PostgreSQL 的可扩展服务器实例时,我们可以在更新客户端证书时有两种可能的方案,具体取决于您如何在应用程序中使用 SSL 连接到 Azure 应用服务。

  • 在您的Azure Database for PostgreSQL灵活服务器实例发生更改之前,新证书将在平台层面的应用服务中添加。 如果您在应用程序中使用了App Service平台中包含的SSL证书,则无需执行任何操作。 有关详细信息,请参阅 Azure App Service 文档中的 在 Azure App Service 中添加和管理 TLS/SSL 证书。
  • 如果在代码中显式包括 SSL 证书文件的路径,则需要下载新证书,并更新代码以使用它。

在 Azure Kubernetes Service (AKS)中使用客户端时更新根 CA 证书,以用于证书绑定场景

如果尝试通过在 Azure Kubernetes 服务(AKS)中托管并使用固定证书的应用程序连接到 Azure Database for PostgreSQL,这与从专用客户主机环境进行访问类似。 请参阅 此处的步骤。

更新 .NET(Npgsql)用户在 Windows 上的根 CA 证书以支持证书绑定场景。

对于在 Windows 上使用 .NET (Npgsql) 的用户,连接到 Azure Database for PostgreSQL 灵活服务器实例时,请确保以下三个证书:Microsoft RSA 根证书颁发机构 2017、DigiCert 全局根 G2 和 DigiCert 全局根 CA 都存在于 Windows 证书存储的受信任的根证书颁发机构中。 如果不存在任何证书,请导入缺少的证书。

更新其他客户端的根 CA 证书,以支持证书绑定场景

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

-----BEGIN CERTIFICATE-----
(Root CA1: DigiCertGlobalRootCA.crt.pem)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Root CA2: Microsoft ECC Root Certificate Authority 2017.crt.pem)
-----END CERTIFICATE-----