如何使用Java提取存储在Azure KeyVault中的证书

时间:2019-06-05 12:53:53

标签: java azure azure-keyvault

我已经在Azure Keyvault中存储了一个.pfx文件。我具有“证书标识符”,“密钥标识符”,“秘密标识符”的值。我想在Java程序中使用.pfx文件。如何从Keyvault提取文件?

我搜索了互联网,发现我们可以使用Keyvault获得证书

KeyVaultClient keyVaultClient = new KeyVaultClient(credentials);
keyVaultClient.getCertificate(this.keyVaultUri, certificateName, '');

1)如何将凭据传递给KeyVaultClient?

2)我是否必须在KeyVaultClient中使用Azure登录凭据?

KeyStore keyStore = KeyStore.getInstance("JKS");

//I have to get this .pfx file from Azure Keyvault

keyStore.load(new FileInputStream(".pfx file"), 
keyPassphrase.toCharArray());

SSLContext sslContext = SSLContexts.custom()
    .loadKeyMaterial(keyStore, keyPassphrase.toCharArray())
    .build();

HttpClient httpClient = 
HttpClients.custom().setSSLContext(sslContext).build();

3 个答案:

答案 0 :(得分:1)

供以后参考,如果您的Java应用程序在App Service或具有Managed Identity的任何其他Azure资源中运行,则有一种更简单的方法:

首先启用指定资源的系统分配的托管身份或用户分配的托管身份。使用在启用受管身份时获得的对象ID,在密钥库的访问策略中对其进行指定,并为其分配必要的权限。在这种情况下,您可以为受管身份分配一个对证书的访问策略' get '。完成所有这些配置后,您需要在application.properties中指定密钥库URL。

azure.keyvault.uri= # url of the keyvault

然后在您要获取证书的Java类中执行以下操作:

  1. 导入以下软件包:
     import com.microsoft.azure.AzureEnvironment;
     import com.microsoft.azure.credentials.AppServiceMSICredentials;
     import com.microsoft.azure.credentials.AzureTokenCredentials;
     import com.microsoft.azure.keyvault.models.CertificateBundle;
  1. 要传递凭据,您需要添加以下几行:

    AzureTokenCredentials credentials = new AppServiceMSICredentials(AzureEnvironment.AZURE);
    KeyVaultClient keyVaultClient = new KeyVaultClient(credentials);
    CertificateBundle certificateBundle = KeyVaultClient.getCertificate(certificateIdentifier);

如果您遵循上述步骤,则第一行将自动允许App Service通过Azure Keyvault进行身份验证。

使用该函数,当您调用KeyVaultClient.getCertificate时,它将返回一个CertificateBundle,您可以在其中找到证书内容。

使用这种方法,您不必在任何地方指定凭据。

答案 1 :(得分:0)

我相信您已经知道Microsoft Azure Key Vault SDK for Java,在这个github页面上有很多示例。有示例是Java Azure Key Vault Deploy Certificates to Vault and Certificate based Authenication

此样本描述了如何创建保管库以及如何在保管库中放置密钥和机密。然后,它展示了如何在部署时使用模板将来自Vault的pfx文件注入到VM中。该示例还显示了使用Java安全性和用于验证签名的Azure Key Vault REST签名和签名验证。该代码调用库中的密钥和机密,并将这些值写入控制台。此示例还显示了如何使用pfx文件进行身份验证。

更新:如果您没有天蓝色的应用,可以authenticate with service principal and a self-signed certificate

您需要创建一个Azure服务主体,如果您希望使用证书身份验证器进行身份验证,则证书应保存在本地。

**注意:**对于ADAL身份验证,还必须设置AZURE_CLIENT_ID和AZURE_CLIENT_SECRET。

而且,是的,pathPfx是证书标识符URL,JavaKeyVaultAuthenticator具有param define关于路径,pfxPassword和clineId。

答案 2 :(得分:0)

我找不到有关如何从Java的密钥库中获取证书的任何信息。我的解决方法是:我将pfx转换为base64(例如,使用openssl)

$ openssl base64 -in <infile> -out <outfile>

我从结果字符串中删除了所有换行符。我将这个干净的base64字符串作为普通字符串秘密放入了Vault中。我给它键“ cert-base64”

我通过Java spring获得了秘密:

@Value("${cert.base64}") private String CERT_BASE64;

为了使用该文件,我将base64解码为byte []:

final byte[] keyStoreData = Base64.getDecoder().decode(CERT_BASE64);

然后将其加载到密钥库中:

KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(new ByteArrayInputStream(keyStoreData), "pw".toCharArray());

实际上,我使用.jks文件而不是.pfx文件。但是,将秘密文件存储为字符串的过程绝对是通用的。 (我猜除了一些大小限制。我测试了最多3KB的文件。)