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

如何使用Java获取存储在Azure KeyVault中的证书,java,azure,azure-keyvault,Java,Azure,Azure Keyvault,我在Azure Keyvault中存储了一个.pfx文件。我有“证书标识符”、“密钥标识符”、“秘密标识符”的值。我想在java程序中使用.pfx文件。我怎样才能从Keyvault中获取文件 我在网上搜索了一下,发现我们可以使用Keyvault获得证书 KeyVaultClient keyVaultClient = new KeyVaultClient(credentials); keyVaultClient.getCertificate(this.keyVaultUri, certificat

我在Azure Keyvault中存储了一个.pfx文件。我有“证书标识符”、“密钥标识符”、“秘密标识符”的值。我想在java程序中使用.pfx文件。我怎样才能从Keyvault中获取文件

我在网上搜索了一下,发现我们可以使用Keyvault获得证书

KeyVaultClient keyVaultClient = new KeyVaultClient(credentials);
keyVaultClient.getCertificate(this.keyVaultUri, certificateName, '');
1) 如何将凭据传递给KeyVault客户端

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();
2) 我必须在KeyVault客户端中使用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();

我相信您已经知道了,在这个github页面中有很多示例。这是一个样品

此示例介绍如何创建vault,以及如何在vault中放置密钥和机密。然后介绍如何在部署时使用模板将vault中的pfx文件注入VM。该示例还显示了签名的签名和验证,Java Security和Azure Key Vault REST用于验证签名。代码调用vault以获取密钥和机密,并将这些值写入console。此示例还显示了如何使用pfx文件进行身份验证

更新:如果你在azure中没有应用程序,你可以

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

**注意:**对于ADAL身份验证,还必须设置AZURE\u客户端\u ID和AZURE\u客户端\u机密


是的,pathPfx是证书标识符url,具有关于路径、pfxPassword和clineId的信息。

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

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

final byte[] keyStoreData = Base64.getDecoder().decode(CERT_BASE64);
然后我将其加载到密钥库:

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

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

作为将来的参考,如果您的Java应用程序运行在App Service或任何其他具有

首先启用指定资源的系统分配的托管标识或用户分配的托管标识。使用启用托管标识时获得的对象ID,在密钥库的访问策略中指定它并为其分配必要的权限。在这种情况下,您将为托管标识分配证书的“get”访问策略。配置完所有这些后,您需要在application.properties中指定keyvault url

azure.keyvault.uri=#keyvault的url

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

  • 导入以下包:
  • 要传递凭据,您需要添加以下行:
  • 如果您遵循前面的步骤,这里的第一行将自动允许应用程序服务使用Azure Keyvault进行身份验证

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


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

    Hi@George Chen,您提供的链接非常有用。请你澄清以下几点好吗。最终字符串clientId=props.getProperty(“clientId”);最终字符串路径=props.getProperty(“pathPfx”);1) 既然我没有在azure上运行任何单独的应用程序,那么我们如何获得KeyVault的“clientId”?2) pfx文件的确切路径是什么,它是否与“证书标识符”的URL相同?@Sahit,我已经更新了我的答案。看看这是否对你有帮助。谢谢@George Chen。被代理问题困扰着。com.microsoft.azure.keyvault.implementation.$Proxy0.getKey(未知源)尝试使用Proxy Proxy=new Proxy(Proxy.Type.HTTP,new InetSocketAddress(“主机名”,端口));“但这没用。”萨希特,你的代理目的是什么?为什么要使用代理进行身份验证?我找不到这个包com.microsoft.azure.keyvault.implementation。每当我点击keyvault url时,我都会收到“未知主机异常”。因此url位于代理的后面。
    KeyStore keyStore = KeyStore.getInstance("JKS");
    keyStore.load(new ByteArrayInputStream(keyStoreData), "pw".toCharArray());
    
         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);