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

이 내가 acquireToken를 호출하는 동안 지문을 전달하는 방법을 잘 모르겠어요 인증 예외를

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

다음의 결과. 여기에 뭔가 빠져 있니?

+0

'asymmetricKeyCredential'을 어떻게 구성하는지 보여줄 수 있습니까? –

+0

완전한 스 니펫으로 원래 게시물이 업데이트되었습니다. – YogeshORai

+0

누군가가 여기에 누락 된 내용을 제안 할 수 있습니까? – YogeshORai

답변

0

코드에 따르면 Azure 서비스 관리 API로 인증서를 사용하여 인증하려고하지만 액세스 토큰을 얻기위한 코드는 Azure AD를 사용하여 인증하는 것으로 보입니다. 그들의 차이점을 알고 싶으면 Authenticating Service Management Requests 문서를 참조하십시오.

참고로 Java에서 인증서를 사용하여 Windows Azure Service Management API를 사용하는 방법을 소개하는 blog이 있습니다.

그러나 제 경험에 따르면 코드 String AAD_RESOURCE_ID = "https://vault.azure.net";에 따르면 Azure Key Vault에 대한 관리 작업을 수행하려는 것으로 보입니다. Azure Key Vault Management에 대한 REST API 참조를 사용하여 Azure Resource Manager로 액세스 토큰을 가져와 이러한 작업을 수행해야합니다. 따라서 Key Vault를 관리하려면 다른 blog을 참조하여 Java에서 ARM을 사용하여 인증하는 방법을 알아보십시오.

희망이 있습니다.


업데이트 : 키 볼트의 AAD_RESOURCE_ID/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>을 통해 리소스 ID를 얻을 수 있습니다.