![](/img/trans.png)
[英]How do I set up a SSLContext using certificate from Azure KeyVault in Java
[英]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 类中执行以下操作:
import com.microsoft.azure.AzureEnvironment;
import com.microsoft.azure.credentials.AppServiceMSICredentials;
import com.microsoft.azure.credentials.AzureTokenCredentials;
import com.microsoft.azure.keyvault.models.CertificateBundle;
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.