0

Je suis nouveau dans les concepts liés à Azure et je suis confronté à un problème de connexion au coffre-fort Azure Key.Erreur lors de la connexion à Azure Key Vault à l'aide de Java

S'il vous plaît trouver mes extraits de code ci-dessous et laissez-moi savoir pourquoi je suis obtenir l'exception ci-dessous:

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)

code correspondant essaie de se connecter Azure Key Vault:

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()); 

Remarque: J'utilise le même ID client et le même secret client que le facteur pour connecter une autre API REST et fonctionne bien. J'ai également essayé d'exécuter le code suivant de here. Mais face à la même question.

S'il vous plaît aidez-moi à identifier pourquoi je suis incapable de connecter le coffre-fort.

+0

Avez-vous donné l'autorisation d'autoriser l'API keyvault pour votre application? –

Répondre

0

Compris le problème, le problème est avec le client_secret qui a des caractères spéciaux comme% lorsqu'il est généré.Il semble que le coffre-fort azur accepte le secret client qui est crypté avec l'encodage base64 et ses caractères spéciaux.

1

J'ai essayé de reproduire votre problème mais j'ai échoué.

Je pensais que votre problème résulte probablement du permission pour autoriser l'API keyvault pour votre application.

Vous pouvez vous référer au code ci-dessous qui fonctionne pour moi.

classe du programme:

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 Classe:

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; 
    } 

} 

Résultats:

enter image description here

Veuillez noter que vous devez autoriser votre application à utiliser la clé ou le secret. Voici le chemin powershell qui est mentionné dans le official doc.

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

Mise à jour Réponse:

Je ne sais pas si votre application a la permission d'appeler KeyVault API. Vous pouvez ajouter cette autorisation sur le portail.

enter image description here

espérons qu'il vous aidera.

+0

Merci mon pote pour votre effort. malheureusement, je reçois toujours la même erreur. J'ai également essayé d'accorder un privilège à mon application pour accéder au coffre-fort. Je ne sais pas quoi faire plus loin. En outre, je suis assez sûr que l'applicationID et le secret fonctionnent bien car il fonctionne dans le facteur pour générer le jeton. – Esh

+0

@Esh Si vous utilisez complètement mon code et ne fonctionne toujours pas. Tenez compte du problème des paramètres ou des autorisations. Vous pouvez essayer de régénérer votre application et votre clé et réessayer. Je continuerai à vous aider à résoudre ce problème. –

+0

@Esh S'il vous plaît voir ma mise à jour answer.Thanks. –