0

Ich bin neu bei Azure-bezogenen Konzepten und habe Probleme beim Verbinden des Azure-Schlüsseltresors.Fehler beim Verbinden von Azure Key Vault mit Java

Bitte meine Code-Snippets finden Sie wie folgt vor und lassen Sie mich wissen, warum ich das unten stehende Ausnahme bekommen:

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)

entsprechenden Code versuche Azure Key Vault zu verbinden:

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

Hinweis: Verwenden Sie die gleiche Client-ID und Client Secret im Postboten zum Verbinden einer anderen REST API und funktioniert fein.

Außerdem habe ich versucht, den folgenden Code von here auszuführen. Aber mit demselben Problem konfrontiert.

Bitte helfen Sie mir zu identifizieren, warum ich den Tresor nicht verbinden kann.

+0

Haben Sie die Berechtigung zum Autorisieren der keyvault API für Ihre Anwendung festgelegt? –

Antwort

0

Das Problem herausgefunden, ist das Problem mit dem client_secret, die einige Sonderzeichen wie% bei der Generierung hat.Es scheint, dass der azurblaue Schlüsseltresor Clientgeheimnisse akzeptiert, die mit der base64-Codierung und seinen Sonderzeichen verschlüsselt sind.

1

Ich habe versucht, Ihr Problem zu reproduzieren, ist aber fehlgeschlagen.

Ich dachte, Ihr Problem ergibt sich wahrscheinlich aus der permission, um keyvault API für Ihre Anwendung zu autorisieren.

Sie könnten auf den folgenden Code beziehen, der für mich funktioniert.

Programmklasse:

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

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

} 

Ergebnisse:

enter image description here

Bitte beachten Sie, dass Sie Ihre Anwendung autorisieren sollten, den Schlüssel oder das Geheimnis zu verwenden. Hier ist die powershell Weg, die in der official doc erwähnt wird.

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

aktualisieren Antwort:

Ich bin nicht sicher, ob Ihre Anwendung Erlaubnis KeyVault API zu nennen hat. Sie können diese Berechtigung im Portal hinzufügen.

enter image description here

Hoffe, dass es Ihnen hilft.

+0

Dank Kumpel für Ihre Mühe. bekomme leider immer noch den gleichen Fehler. Außerdem habe ich versucht, meiner Anwendung den Zugriff auf den Schlüsseltresor zu gewähren. Ich bin mir nicht sicher, was ich weiter machen soll. Außerdem bin ich mir ziemlich sicher, dass die ApplicationID und das Secret gut funktionieren, da es im Postman funktioniert, Token zu generieren. – Esh

+0

@Esh Wenn Sie meinen Code vollständig verwenden und immer noch nicht funktionieren. Berücksichtigen Sie das Problem von Parametern oder Berechtigungen. Sie könnten versuchen, Ihre Anwendung und den Schlüssel neu zu generieren und es erneut zu versuchen. Ich werde Ihnen weiterhin helfen, dieses Problem zu beheben. –

+0

@Esh Bitte sehen Sie meine Update-Antwort. Danke. –

Verwandte Themen