0

Я использую adal4j v1.1.2 для получения токена на основе сертификата клиента.adal4j: ошибка аутентификации на основе сертификата: недействительный токен JWT

Отрывок называют: Why does AcquireToken with ClientCredential fail with invalid_client (ACS50012)?

String AAD_HOST_NAME = "login.windows.net"; 
String AAD_TENANT_ID = "XXX"; 
String AAD_TENANT_ENDPOINT = "https://" + AAD_HOST_NAME + "/" + AAD_TENANT_ID + "/"; 
String AAD_CLIENT_ID = "XXX"; 
String AAD_RESOURCE_ID = "https://vault.azure.net"; 
String AAD_CERTIFICATE_PATH = "/XXX.pfx"; 
String AAD_CERTIFICATE_PASSWORD = "XXX"; 
String AAD_CLIENT_SECRET = "XXX"; 

ExecutorService service = ExecutorServiceHelper.createThreadPool(1, "azureHSMClientExecutorService-"); 

KeyStore keystore = KeyStore.getInstance("PKCS12", "SunJSSE"); 
keystore.load(new FileInputStream(AAD_CERTIFICATE_PATH),AAD_CERTIFICATE_PASSWORD.toCharArray()); 
String alias = keystore.aliases().nextElement(); 
PrivateKey key = (PrivateKey) keystore.getKey(alias, AAD_CERTIFICATE_PASSWORD.toCharArray()); 
X509Certificate cert = (X509Certificate) keystore.getCertificate(alias); 
AsymmetricKeyCredential asymmetricKeyCredential = AsymmetricKeyCredential.create(AAD_CLIENT_ID,key, cert); 
AuthenticationContext ctx = new AuthenticationContext(AAD_TENANT_ENDPOINT, false, service); 
Future<AuthenticationResult> result = ctx.acquireToken(AAD_RESOURCE_ID, asymmetricKeyCredential, null); 
AuthenticationResult authenticationResult = result.get(); 
String token = authenticationResult.getAccessToken(); 

Это приводит следующие AUTH за исключением

AuthenticationException: com.microsoft.aad.adal4j.AuthenticationException: {"error":"invalid_client","error_description":"AADSTS70002: Error validating credentials. AADSTS50027: Invalid JWT token. No certificate thumbprint specified in token header.\r\nTrace ID: 9719e621-d8ef-4194-93cd-a78103d5df6b\r\nCorrelation ID: f0300795-fb99-44b2-bd95-8df3975290be\r\nTimestamp: 2016-08-29 13:51:26Z"} 

Я не знаю, как передать отпечаток пальца при вызове acquireToken. Здесь что-то не хватает?

+0

Можете ли вы показать нам, как вы строите 'асимметричныйKeyCredential'? –

+0

обновленный оригинальный пост с полным фрагментом – YogeshORai

+0

Может кто-нибудь подскажет, что здесь отсутствует – YogeshORai

ответ

0

В соответствии с вашим кодом кажется, что вы хотите выполнить аутентификацию с помощью API управления Azure Service, используя сертификат, но код для доступа к токену, похоже, аутентифицируется с использованием Azure AD. Вы можете обратиться к статье Authenticating Service Management Requests, чтобы узнать их отличия.

В качестве справочной информации есть blog, в которых рассказывается, как использовать API управления сервисами Windows Azure с сертификатом на Java.

Однако, согласно моему опыту, в соответствии с кодом String AAD_RESOURCE_ID = "https://vault.azure.net";, также кажется, что вы хотите выполнить некоторые операции управления для Azure Key Vault. С помощью ссылки REST API для Azure Key Vault Management вы должны получить маркер доступа с помощью Azure Resource Manager для выполнения этих операций. Поэтому, если вы хотите управлять Key Vault, обратитесь к другому blog, чтобы узнать, как аутентифицироваться с помощью ARM на Java.

Надеюсь, что это поможет.


Update:

AAD_RESOURCE_ID для Key Vault должен быть как /subscriptions/{subscription-id}/resourceGroups/{resource-group-name}/providers/Microsoft.KeyVault/vaults/{vault-name}, пожалуйста, обратитесь к статье https://msdn.microsoft.com/en-us/library/azure/mt620025.aspx и поиск по ключевому слову resource id и увидеть, как на рисунке ниже. enter image description here

И вы можете получить идентификатор ресурса через команду Azure CLI azure keyvault show --vault-name <your-keyvault-name>.