当前位置: 首页 > 知识库问答 >
问题:

使用Java获取Azure KeyVault密钥

穆乐逸
2023-03-14

在使用Java从azure keyvault检索机密时,我面临一个问题

我使用了以下依赖项azure-security-keyvault-secrets-4.3.6。jar azure-identity-1.4.2。jar azure-core-1.12.0。罐子

还有我的密码,

String keyVaultUri = "https://keyvaultName.vault.azure.net";
SecretClient secretClient = new SecretClientBuilder()
    .vaultUrl(keyVaultUri)
    .credential(new DefaultAzureCredentialBuilder().build())
    .buildClient();
    
KeyVaultSecret retrievedSecret = secretClient.getSecret("azureTableConnectionString");
System.out.println(retrievedSecret.getValue());

当我运行上面的代码时,我得到了下面的错误

Exception in thread "main" java.lang.NoClassDefFoundError: org/reactivestreams/Publisher
    at com.azure.core.http.policy.RetryPolicy.<init>(RetryPolicy.java:73)
    at com.azure.core.http.policy.RetryPolicy.<init>(RetryPolicy.java:37)
    at com.azure.security.keyvault.secrets.SecretClientBuilder.<init>(SecretClientBuilder.java:123)
    at sage50ukv26.test_0_1.test.tJava_1Process(test.java:892)
    at sage50ukv26.test_0_1.test.tLibraryLoad_3Process(test.java:814)
    at sage50ukv26.test_0_1.test.tLibraryLoad_2Process(test.java:651)
    at sage50ukv26.test_0_1.test.tLibraryLoad_1Process(test.java:499)
    at sage50ukv26.test_0_1.test.runJobInTOS(test.java:1434)
    at sage50ukv26.test_0_1.test.main(test.java:1204)
Caused by: java.lang.ClassNotFoundException: org.reactivestreams.Publisher
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:352)

共有1个答案

上官英哲
2023-03-14

还有一种方法可以通过AzureAD应用程序获取azureKeyVault机密值。

访问keyVault需要以下信息。

•客户Id

添加秘密(客户端秘密)

•KeyVault URL。

确保在创建AzureKeyVault时将访问策略分配给keyvault。

现在保留所有默认设置,并查看创建

使用Java访问Azure Key Vault需要这些差异。

添加到pom中。xml文件

<properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

 <dependencies>
        <!-- https://mvnrepository.com/artifact/com.azure/azure-core -->
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>msal4j</artifactId>
            <version>1.11.0</version>
        </dependency>
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure</artifactId>
            <version>1.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-keyvault</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
        </dependency>
    </dependencies>

Java代码示例

package com.example.azure.keyvault;

import java.net.MalformedURLException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import com.microsoft.aad.adal4j.AuthenticationContext;
import com.microsoft.aad.adal4j.AuthenticationResult;
import com.microsoft.aad.adal4j.ClientCredential;
import com.microsoft.azure.keyvault.KeyVaultClient;
import com.microsoft.azure.keyvault.authentication.KeyVaultCredentials;
import com.microsoft.azure.keyvault.models.SecretBundle;


import java.util.concurrent.Future;

public class KeyVaultTest {

    private static AuthenticationResult getAccessToken(String authorization, String resource) throws InterruptedException, ExecutionException, MalformedURLException {

        String clientId = "XXXXXXXX"; // Client ID
        String clientKey = "XXXXXXXXXXXX";  //Client Secret

        AuthenticationResult result = null;

        //Starts a service to fetch access token.
        ExecutorService service = null;
        try {
            service = Executors.newFixedThreadPool(1);
            AuthenticationContext context = new AuthenticationContext(authorization, false, service);

            Future<AuthenticationResult> future = null;

            //Acquires token based on client ID and client secret.
            if (clientKey != null && clientKey != null) {
                ClientCredential credentials = new ClientCredential(clientId, clientKey);
                future = context.acquireToken(resource, credentials, null);
            }

            result = future.get();
        } finally {
            service.shutdown();
        }

        if (result == null) {
            throw new RuntimeException("Authentication results were null.");
        }
        return result;
    }

    public static void main(String[] args) {
        String vaultBase = "https://ohankeXXXXX.vault.azure.net/"; //KeyVaultURI

        KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultCredentials(){
            @Override
            public String doAuthenticate(String authorization, String resource, String scope) {
                String token = null;
                try {
                    AuthenticationResult authResult = getAccessToken(authorization, resource);
                    token = authResult.getAccessToken();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return token;
            }
        });

        SecretBundle test = keyVaultClient.getSecret(vaultBase, "test"); //created a secret in keyault with name test
        System.out.println(test.value());
    }
}

控制台中的输出

参考资料: 1.http://www.stratogator.com/2017/10/20/how-to-access-secrets-in-azure-key-vault-using-java/2.如何从密钥库获取机密?

 类似资料:
  • 我在使用来自Firebase的新FiRecovery时遇到了问题。 情境:我有一个 我使用集合(“房间”)创建房间。添加(房间) 我想做的是:我需要更新一个房间。 为此,我使用:<代码>集合('room')。doc(房间ID)。更新(update) 因此,我需要在我的收藏中的文档中添加ROOM\u ID: 有没有可能实现这一目标? 另一种方法是为自己创建一个生成的ID: 但我想避免它。

  • 在尝试使用AzureKeyVault保护密钥时,我遇到以下错误: 00:01:41错误]读取钥匙圈时出错。微软蔚蓝色的钥匙库。模型。KeyVaultErrorException:操作在Microsoft返回了无效的状态代码“禁止”。蔚蓝色的钥匙库。KeyVault客户端。WrapkeyWithTtpMessageAsync(String Vault BaseUrl、String keyName、S

  • 问题内容: 我在Java中有一个Hashmap,如下所示: 然后我像这样填充它: 如何获得钥匙?类似于:返回“ United”。 问题答案: 一个包含多个键。您可以用来获取所有键的集合。 将存储与key 和key 。要遍历所有键: 将打印和。

  • 问题内容: 我有一些看起来像这样的JSON 我将其解析为JArray: 然后,我遍历数组: 是一个 如何检索每个项目的“名称”或“键”? 例如,“ MobileSiteContent”或“ PageContent” 问题答案: 是基类,,,,等你可以使用的方法来获得JToken的孩子是某种类型的过滤列表,例如。每个对象都有一个对象集合,可以通过方法访问这些对象。对于每个,您都可以得到它。(当然,如

  • 我有一个有3个JsonNodes的数组。我设法打印了我想要的JsonNode(它是一个数组) 不幸的是,它看起来像是将值合并在一起。如何将键与值部分中的值分开? 举个例子 或dosent work!键为,值为: