在 Spring Boot 应用程序中从 Azure Key Vault 检索私钥

问题描述

我在 Azure Key Vault 中有一个 .pfx 证书。我需要从中检索私钥以解密 Spring Boot 应用程序中的字符串值。

我已经使用 azure-spring-boot-starter-keyvault-certificates 库将证书加载到 java 密钥库,这似乎工作正常。

我不明白的是如何检索私钥部分。任何关于我做错了什么的线索?

    KeyStore azureKeyVaultKeyStore = KeyStore.getInstance("AzureKeyVault");
    KeyVaultLoadStoreParameter parameter = new KeyVaultLoadStoreParameter(
            System.getProperty("azure.keyvault.uri"),System.getProperty("azure.keyvault.tenant-id"),System.getProperty("azure.keyvault.client-id"),System.getProperty("azure.keyvault.client-secret"));
    azureKeyVaultKeyStore.load(parameter);

    // returns null!
    PrivateKey privateKey = (PrivateKey) azureKeyVaultKeyStore.getKey(environment.getProperty("azure.keyvault.alias"),"".toCharArray()); 

    // decrypt value
    Cipher c = Cipher.getInstance(privateKey.getAlgorithm());
    c.init(Cipher.DECRYPT_MODE,privateKey);
    c.update(DatatypeConverter.parseBase64Binary(cryptedMsg));
    String decryptedMessage = new String(c.doFinal());

在我的机器上使用相同的证书进行测试的工作方式如下:

        KeyStore keyStore = KeyStore.getInstance("pkcs12");
        keyStore.load(new FileInputStream(filename),password.toCharArray());

        PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias,password.toCharArray());

解决方法

可以使用 GetSecret() 方法获取私钥,否则只能获取公共部分。

请参阅 this 文章以了解详细信息(即使对于 .NET 来说也很困难,我希望您能弄清楚如何在 Java 中执行此操作)或查看 Java 示例 here

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...