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