如何使用 Java 操作密钥保管库管理及客户端 API

问题描述

在创建 KeyVaultClient 时不能通过 ApplicationTokenCredentials 来进行认证,如何通过 Java 来获取密钥保管库的密钥或机密。

问题分析

需要基于 ADAL Library ,通过重写 doAuthenticate 方法来创建 KeyVaultClient 来做认证。

解决方法

  • PowerShell

      Login-AzureRmAccount -EnvironmentName AzureChinaCloud
      Set-AzureRmContext -SubscriptionId "sub id"
      New-AzureRmKeyVault -VaultName 'geovault02' -ResourceGroupName 'geogroup' -Location 'China North'
      $securepfxpwd = ConvertTo-SecureString -String '1QAZxsw2' -AsPlainText -Force
      $key = Add-AzureKeyVaultKey -VaultName 'geovault02' -Name 'key1' -KeyFilePath 'E:\cer.pfx' -KeyFilePassword $securepfxpwd
      $Key.key.kid
      # 授权需要授予 get 权限,否则 Client API 读取时会报告权限问题
      Set-AzureRmKeyVaultAccessPolicy -VaultName 'geovault02' -ServicePrincipalName ‘Clinet ID’ -PermissionsToKeys decrypt,sign,get
      Set-AzureRmKeyVaultAccessPolicy -VaultName 'geovault02' -ServicePrincipalName ‘Clinet ID’ -PermissionsToSecrets Get
    
  • Maven Dependency

      <dependency>
      <groupId>com.microsoft.azure</groupId>
          <artifactId>azure-keyvault</artifactId>
          <version>1.0.0</version>
      </dependency>
      <dependency>
          <groupId>com.microsoft.azure</groupId>
          <artifactId>adal4j</artifactId>
          <version>1.2.0</version>
      </dependency>
    
  • Test Class

    public class KeyVaultTest { private ApplicationTokenCredentials tokenCredentials; private KeyVaultClient keyVaultClient; private Azure azure;

      public KeyVaultTest(String clientId, String clientSecret) {
          try {
              keyVaultClient = new KeyVaultClient(new KeyVaultCredentials() {
                  @Override
                  public String doAuthenticate(String authorization, String resource, String scope) {
                      AuthenticationContext context;
                      try {
                          context = new AuthenticationContext(authorization, false, Executors.newFixedThreadPool(1));
                          ClientCredential credentials = new ClientCredential(clientId, clientSecret);
                          AuthenticationResult result = context.acquireToken(resource, credentials, null).get();
                          return result.getAccessToken();
                      } catch (Exception e) {
                          e.printStackTrace();
                      }
                      return "";
                  }
              });
    
              System.out.println("认证成功!");
    
          } catch (CloudException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
      public void getKey(String keyIdentifier) {
          KeyBundle keyBundle = keyVaultClient.getKey(keyIdentifier);
          System.out.println(keyBundle.toString());
      }
    

    }

  • Junit Test

      @org.junit.Test
          public void test(){
                  KeyVaultTest keyVault = new KeyVaultTest(
      "Client ID", "Client Secret");
                  keyVault.getKey(
      "https://geovault02.vault.azure.cn:443/keys/key1");
      }
    
      {"key":{"kid":"https://geovault02.vault.azure.cn/keys/key1/a0e2b77b58824f9c96f0f3b1e48e4235","kty":"RSA","key_ops":["encrypt","decrypt","sign","verify","wrapKey","unwrapKey"],"n":"n2eviMHVMcV-HBVxOiqXV1qbxBy9vEW3c_lTv3VwFaqseWIdaTq5UQvZH7QJ-lRJB_CgRpxMansLEc1YlObhcvxQ_ASeuZiHe0MaZz54Ucen-dzWNpdWHGJuSAbL7y1o-_Kqmp3oJ0SfhS8QMruiOIB8AZDE0-rZ-f7H9y0FZbxRh8CjgtfapgU2OL1O4E-RkHqSX7coHo9R1TAfGdQVe9zttFiZQ5NBwQ3G_NHN1x8342zy52VlDASy5xM-LafYQekjSVF1IHFAVlhQ6-LZs4sE70F_9QyNGS56mHgYYI-lHKo5OnfMWtBe4esaanqyMxwXPQMNTPm-sH1SYOyaYQ","e":"AQAB","d":null,"dp":null,"dq":null,"qi":null,"p":null,"q":null,"k":null,"key_hsm":null},"attributes":{"enabled":true,"nbf":null,"exp":null},"tags":null}