0

Azure 관련 새로운 개념에 익숙하지 않고 Azure Key 볼트를 연결하는 데 문제가 있습니다.Java를 사용하여 Azure Key Vault를 연결하는 중 오류가 발생했습니다.

다음과 같이 내 코드 조각을 찾아 내게 이유를 아래의 예외를 얻고있다 알려 주시기 바랍니다 : 코드 푸른 키 볼트를 연결하려고 해당

Get Key started.../n SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. Get Key failedjava.lang.RuntimeException: java.util.concurrent.ExecutionException: com.microsoft.aad.adal4j.AuthenticationException: {"error_description":"AADSTS70002: Error validating credentials. AADSTS50012: Invalid client secret is provided.\r\nTrace ID: 13f8e909-89d8-472f-a1c1-9f4bcf693700\r\nCorrelation ID: bf818c41-4092-4f7d-8292-b1275a5da62f\r\nTimestamp: 2017-10-17 07:22:12Z","error":"invalid_client"} Exception in thread "main" java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.util.concurrent.ExecutionException: com.microsoft.aad.adal4j.AuthenticationException: {"error_description":"AADSTS70002: Error validating credentials. AADSTS50012: Invalid client secret is provided.\r\nTrace ID: 1234\r\nCorrelation ID: 123456\r\nTimestamp: 2017-10-17 07:22:12Z","error":"invalid_client"} at com.google.common.util.concurrent.AbstractFuture$Sync.getValue(AbstractFuture.java:299) at com.google.common.util.concurrent.AbstractFuture$Sync.get(AbstractFuture.java:286) at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:116) at Program.main(Program.java:88)

:

KeyVaultCredentials kvCred = new ClientSecretKeyVaultCredential("clientID", "client Secret"); 
    KeyVaultClient vc = new KeyVaultClient(kvCred); 



    byte[] byteText = textToEncrypt.getBytes("UTF-16"); 

    /*************************************/ 

    // Get Key from Key Vault 
    System.out.println("Get Key started.../n"); 

    start = System.currentTimeMillis(); 
    ServiceCallback<KeyBundle> serviceCallbackgetkey = new ServiceCallback<KeyBundle>(){ 
     @Override 
     public void failure(Throwable t) { 
      System.out.println("Get Key failed"+t.toString()); 

     } 

     @Override 
     public void success(KeyBundle result) {//ServiceResponse 
      System.out.println("Get Key Success"); 
      JsonWebKey myKey = result.key(); 
      keyIdentifier = myKey.kid(); 
      System.out.println("Key ID:"+keyIdentifier); 
      end = System.currentTimeMillis();  
      formatter = new DecimalFormat("#0.00000"); 
      System.out.print("Get Key Execution time is " + formatter.format((end - start)/1000d) + " seconds\n"); 
      start = 0; 
      end =0; 
     } 
    }; 

    ServiceCall<KeyBundle> call = vc.getKeyAsync(keyVaultURI, "MyKey1", serviceCallbackgetkey); 

    System.out.println(call.get()); 

참고 : 다른 REST API를 연결하기 위해 우편 클라이언트에서 동일한 Client-ID 및 Client Secret을 사용 중이며 작동 중입니다. 벌금.

또한 here에서 다음 코드를 실행 해 보았습니다. 그러나 똑같은 문제에 직면 해있다.

왜 볼트에 연결할 수 없는지 확인하는 것을 도와주세요.

+0

애플리케이션에 대한 keyvault API를 인증 할 수있는 권한을 설정 했습니까? –

답변

0

문제는 %와 같은 특수 문자가 생성 된 client_secret에서 발생합니다.azure key vault는 base64 인코딩으로 암호화 된 클라이언트 비밀을 수락하고 있으며 특수 문자입니다.

1

문제를 재현하려고했지만 실패했습니다.

귀하의 응용 프로그램에 keyvault API를 인증하기 위해 permission에서 문제가 발생한 것으로 보았습니다.

나를 위해 적합한 아래 코드를 참조 할 수 있습니다.

프로그램 등급 :

import java.io.UnsupportedEncodingException; 
import java.net.URISyntaxException; 
import java.util.concurrent.ExecutionException; 

import com.microsoft.azure.keyvault.KeyVaultClient; 
import com.microsoft.azure.keyvault.authentication.KeyVaultCredentials; 


public class Program { 

    public static void main(String[] args) 
      throws InterruptedException, ExecutionException, URISyntaxException, UnsupportedEncodingException { 

     KeyVaultCredentials kvCred = new ClientSecretKeyVaultCredential("APP_ID", "APP_SECRET"); 
     KeyVaultClient vc = new KeyVaultClient(kvCred); 
     String keyIdentifier = "https://jaygong.vault.azure.net/keys/jaytest/b21bae081025418c806d73affc2937e0"; 
     System.out.println(vc.getKey(keyIdentifier)); 

    } 
} 

ClientSecretKeyVaultCredential 등급 :

import java.net.MalformedURLException; 
import java.util.concurrent.ExecutionException; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Future; 
import com.microsoft.aad.adal4j.AuthenticationContext; 
import com.microsoft.aad.adal4j.AuthenticationResult; 
import com.microsoft.aad.adal4j.ClientCredential; 
import com.microsoft.azure.keyvault.authentication.KeyVaultCredentials; 

public class ClientSecretKeyVaultCredential extends KeyVaultCredentials { 
    private String applicationId; 
    private String applicationSecret; 

    public ClientSecretKeyVaultCredential(String applicationId, String applicationSecret) { 
     this.setApplicationId(applicationId); 
     this.setApplicationSecret(applicationSecret); 
    } 

    public String getApplicationId() { 
     return applicationId; 
    } 

    private void setApplicationId(String applicationId) { 
     this.applicationId = applicationId; 
    } 

    public String getApplicationSecret() { 
     return applicationSecret; 
    } 

    private void setApplicationSecret(String applicationSecret) { 
     this.applicationSecret = applicationSecret; 
    } 

    @Override 
    public String doAuthenticate(String authorization, String resource, String scope) { 
     AuthenticationResult res = null; 

     try { 
      res = GetAccessToken(authorization, resource, applicationId, applicationSecret); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return res.getAccessToken(); 
    } 

    private AuthenticationResult GetAccessToken(String authorization, String resource, String clientID, String clientKey) 
      throws InterruptedException, ExecutionException { 
     AuthenticationContext ctx = null; 
     ExecutorService service = Executors.newFixedThreadPool(1); 
     try { 
      ctx = new AuthenticationContext(authorization, false, service); 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     Future<AuthenticationResult> resp = ctx.acquireToken(resource, new ClientCredential(
       clientID, clientKey), null); 
     AuthenticationResult res = resp.get(); 
     return res; 
    } 

} 

결과 :

enter image description here

키 또는 암호를 사용하도록 응용 프로그램을 인증해야합니다. 여기에 official doc에 언급 된 powershell 방법이 있습니다.

Set-AzureRmKeyVaultAccessPolicy -VaultName 'XXXXXXX' -ServicePrincipalName XXXXX -PermissionsToKeys decrypt,sign,get,unwrapKey 


업데이트 답 :

내가 응용 프로그램 KeyVault API를 호출 할 수있는 권한이 있는지 확실하지 않습니다. 포털에이 권한을 추가 할 수 있습니다.

enter image description here

은 당신을 도움이되기를 바랍니다.

+0

귀하의 노력에 감사드립니다. 불행히도 여전히 같은 오류가 발생합니다. 또한 내 애플리케이션에서 키 저장소에 액세스 할 수있는 권한을 부여하려고 시도했습니다. 더 이상 무엇을 해야할지 잘 모릅니다. 또한, 토큰을 생성하기 위해 우편 배달부에서 일하고 있기 때문에 applicationID와 secret이 잘 작동하고 있음을 확신합니다. – Esh

+0

@Esh 내 코드를 완전히 사용하지만 여전히 작동하지 않는 경우. 매개 변수 또는 사용 권한 문제를 고려하십시오. 응용 프로그램과 키를 재생성하고 다시 시도 할 수 있습니다. 이 문제를 해결하는 데 계속 도움을 드리겠습니다. –

+0

@Esh 내 업데이트 답변을 참조하십시오. 감사합니다. –