You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Java从Azure密钥保管库的PFX证书中获取PrivateKey对象

从Azure密钥保管库的PFX证书中获取PrivateKey对象(Java)

你现有的代码仅能获取证书的公钥和元数据,KeyVaultCertificateWithPolicy 并不包含私钥。要提取私钥,需要通过SecretClient获取存储在密钥保管库中的PFX格式证书(Azure会将证书的私钥以同名Secret的形式存储),再解析为PrivateKey对象。

步骤说明

  • 确保项目引入azure-security-keyvault-secrets依赖(以Maven为例):
<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-security-keyvault-secrets</artifactId>
    <version>4.7.0</version> <!-- 使用最新稳定版本即可 -->
</dependency>
  • 通过SecretClient获取PFX证书的Secret值,该值是Base64编码的PFX字节流
  • 将Base64解码后的字节加载到Java KeyStore,提取私钥(Azure生成的PFX证书默认密码为空字符串)

完整代码示例

import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.security.keyvault.certificates.CertificateClient;
import com.azure.security.keyvault.certificates.CertificateClientBuilder;
import com.azure.security.keyvault.certificates.models.KeyVaultCertificateWithPolicy;
import com.azure.security.keyvault.secrets.SecretClient;
import com.azure.security.keyvault.secrets.SecretClientBuilder;
import com.azure.security.keyvault.secrets.models.KeyVaultSecret;

import java.io.ByteArrayInputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.util.Collections;

public class AzureKeyVaultPrivateKeyExtractor {
    public static void main(String[] args) throws Exception {
        String vaultUrl = "你的密钥保管库URL";
        String certificateName = "certificateName";

        // 初始化CertificateClient(你已有的代码)
        CertificateClient certificateClient = new CertificateClientBuilder()
                .vaultUrl(vaultUrl)
                .credential(new DefaultAzureCredentialBuilder().build())
                .buildClient();
        KeyVaultCertificateWithPolicy certificate = certificateClient.getCertificate(certificateName);

        // 初始化SecretClient,获取PFX格式的证书Secret
        SecretClient secretClient = new SecretClientBuilder()
                .vaultUrl(vaultUrl)
                .credential(new DefaultAzureCredentialBuilder().build())
                .buildClient();
        KeyVaultSecret pfxSecret = secretClient.getSecret(certificateName);

        // 解码Base64格式的PFX内容
        byte[] pfxBytes = java.util.Base64.getDecoder().decode(pfxSecret.getValue());

        // 加载PFX到KeyStore
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        ByteArrayInputStream pfxInputStream = new ByteArrayInputStream(pfxBytes);
        keyStore.load(pfxInputStream, "".toCharArray());

        // 提取私钥:遍历KeyStore所有别名,筛选密钥条目
        PrivateKey privateKey = null;
        for (String alias : Collections.list(keyStore.aliases())) {
            if (keyStore.isKeyEntry(alias)) {
                privateKey = (PrivateKey) keyStore.getKey(alias, "".toCharArray());
                break;
            }
        }

        if (privateKey != null) {
            System.out.println("成功获取私钥:" + privateKey.getAlgorithm());
        } else {
            System.err.println("未找到对应私钥");
        }
    }
}

关键注意点

  • Azure密钥保管库中,创建证书时会自动生成同名的Secret,存储包含私钥的PFX格式证书,因此Secret名称与证书名称一致
  • 加载KeyStore时使用空字符串作为密码,这是Azure生成PFX证书的默认规则
  • 若通过证书subjectDN作为别名找不到私钥,遍历KeyStore所有别名并筛选密钥条目是更可靠的方式

内容的提问来源于stack exchange,提问作者Kratika Kapoor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:22:52