更新应用程序客户端证书

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

重要

Microsoft为 Azure Database for PostgreSQL 启动 TLS 证书轮换 ,以更新中间 CA 证书和生成的证书链。 根 CA 保持不变。

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

证书轮换计划

  • 2026年春节(春节)结束后,中国地区将进行证书轮换,其中包括 对其中一种根 CA 的更改

在客户端上的 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 证书存储。 下面的示例演示如何使用 DefaultJavaSSLFactory for PostgreSQL JDBC 用户。

        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 灵活服务器实例时,我们在更新客户端证书时可能会有两种情况,这取决于您是否以及如何在部署到 Azure 应用服务的应用程序中使用 SSL。

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

在 Azure Kubernetes 服务(AKS)中使用客户端时更新根 CA 证书,以用于证书固定方案

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

更新 Windows 上 .NET (Npgsql) 用户的根 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-----