你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用 Azure Database for PostgreSQL - 灵活服务器更新应用程序客户端的客户端 TLS 证书
适用于: Azure Database for PostgreSQL 灵活服务器
在客户端上的 Java 密钥存储中导入根 CA 证书以用于证书固定方案
自定义编写的 Java 应用程序使用名为 cacerts 的默认密钥存储,其中包含受信任的证书颁发机构 (CA) 证书。 它通常也称为 Java 信任存储。 名为 cacerts 的证书文件驻留在安全属性目录 java.home\lib\security 中,其中 java.home 是运行时环境目录(SDK 中的 jre 目录或 Java™ 2 运行时环境的顶级目录)。 可以使用以下说明通过 PostgreSQL 灵活服务器更新客户端证书固定方案的客户端根 CA 证书:
- 检查 cacerts java 密钥存储,以查看它是否已包含所需的证书。 可以使用以下命令列出 Java 密钥存储中的证书:
keytool -list -v -keystore ..\lib\security\cacerts > outputfile.txt
如果客户端上的 java 密钥存储中没有必要的证书(可以在输出中检查),则应按照以下指示进行操作:
创建自定义密钥存储的备份副本。
下载证书并在本地保存这些证书,以便在本地进行引用。
生成包含所有所需根 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
将原始密钥存储文件替换为新生成的密钥存储文件:
System.setProperty("javax.net.ssl.trustStore","path_to_truststore_file"); System.setProperty("javax.net.ssl.trustStorePassword","password");
将原始根 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;
}
cacerts 的默认密码是 changeit,但在实际客户端上应有所不同,因为管理员建议在 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 应用服务中的客户端与 Azure Database for PostgreSQL - 灵活服务器配合使用时更新根 CA 证书
对于 Azure 应用服务,连接到 Azure Database for PostgreSQL 时,我们可以有两种更新客户端证书的可能方案,这取决于如何将 SSL 用于部署到 Azure 应用服务的应用程序。
- 在 Azure Database for PostgreSQL 灵活服务器更改之前,在平台级别将新证书添加到应用服务。 如果你在应用程序中使用应用服务平台上包含的 SSL 证书,则无需执行任何操作。 有关详细信息,请参阅以下 Azure 应用服务文档。
- 如果你在代码中显式包含 SSL 证书文件的路径,则需要下载新证书并更新代码以使用新证书。这种情况的一个很好的示例是在应用服务中使用自定义容器,如应用服务文档中所述
将 Azure Kubernetes 服务 (AKS) 中的客户端与 Azure Database for PostgreSQL - 灵活服务器配合使用时更新根 CA 证书,用于证书固定方案
如果尝试使用托管在 Azure Kubernetes 服务 (AKS) 和固定证书中的应用程序连接到 Azure Database for PostgreSQL,则类似于从专用客户主机环境进行访问。 请参考此处的步骤。
使用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-----