我已经在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();
答案 0 :(得分:1)
供以后参考,如果您的Java应用程序在App Service或具有Managed Identity的任何其他Azure资源中运行,则有一种更简单的方法:
首先启用指定资源的系统分配的托管身份或用户分配的托管身份。使用在启用受管身份时获得的对象ID,在密钥库的访问策略中对其进行指定,并为其分配必要的权限。在这种情况下,您可以为受管身份分配一个对证书的访问策略' get '。完成所有这些配置后,您需要在application.properties中指定密钥库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);
如果您遵循上述步骤,则第一行将自动允许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的文件。)