繁体   English   中英

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

[英]How to fetch certificate stored in Azure KeyVault using Java

我在 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();

为了将来参考,如果您的 Java 应用程序在应用服务或任何其他具有托管标识的Azure 资源中运行,则有一种更简单的方法来执行此操作:

首先启用指定资源的系统分配的托管标识或用户分配的托管标识。 使用您在启用托管标识时获得的对象 ID,在 Key Vault 的访问策略中指定它并为其分配必要的权限。 在这种情况下,您将为托管标识分配“获取”证书的访问策略。 配置完所有这些后,您需要在 application.properties 中指定 keyvault 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);

如果您按照前面的步骤操作,此处的第一行将自动允许应用服务通过 Azure Keyvault 进行身份验证。

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

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

我相信您已经知道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 文件进行身份验证。

更新:如果您没有 azure 中的应用程序,您可以 使用服务主体和自签名证书进行身份验证

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

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

而且,是的,pathPfx 是证书标识符 url, JavaKeyVaultAuthenticator有关于路径、pfxPassword 和 clineId 的参数定义

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

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

从结果字符串中我删除了所有换行符。 我将这个清理过的 base64 字符串作为普通字符串秘密放入保管库。 我给它密钥“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 的工作。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM