首页 > 解决方案 > Java Azure SDK,com.microsoft.aad.adal4j.AcquireTokenCallable 类的执行失败

问题描述

我正在使用 azure SDK 运行一些自动化测试。起初它工作正常,经过几次尝试进行身份验证(每个测试执行新的身份验证),得到以下错误。可能是什么原因?

在此处输入图像描述

08:39:45 [jsystem] [pool-54-thread-1] INFO com.microsoft.aad.adal4j.AuthenticationAuthority - [Correlation ID: 5ceb4f83-441b-4263-8134-b91a69101b2d] Instance discovery was successful 
08:39:46 [jsystem] [pool-54-thread-1] ERROR com.microsoft.aad.adal4j.AuthenticationContext - [Correlation ID: 5ceb4f83-441b-4263-8134-b91a69101b2d] Execution of class com.microsoft.aad.adal4j.AcquireTokenCallable failed. 
08:39:46 [jsystem] javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate ECDH keypair 
08:39:46 [jsystem] at sun.security.ssl.Alert.createSSLException(Unknown Source) 
08:39:46 [jsystem] at sun.security.ssl.TransportContext.fatal(Unknown Source) 
08:39:46 [jsystem] at sun.security.ssl.TransportContext.fatal(Unknown Source) 
08:39:46 [jsystem] at sun.security.ssl.TransportContext.fatal(Unknown Source) 
08:39:46 [jsystem] at sun.security.ssl.SSLSocketImpl.handleException(Unknown Source) 
08:39:46 [jsystem] at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
08:39:46 [jsystem] at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source) 
08:39:46 [jsystem] at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source) 
08:39:46 [jsystem] at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source) 
08:39:46 [jsystem] at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(Unknown Source) 
08:39:46 [jsystem] at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(Unknown Source) 
08:39:46 [jsystem] at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(Unknown Source) 
08:39:46 [jsystem] at com.microsoft.aad.adal4j.AdalOAuthRequest.configureHeaderAndExecuteOAuthCall(AdalOAuthRequest.java:145) 
08:39:46 [jsystem] at com.microsoft.aad.adal4j.AdalOAuthRequest.send(AdalOAuthRequest.java:83) 
08:39:46 [jsystem] at com.microsoft.aad.adal4j.AdalTokenRequest.executeOAuthRequestAndProcessResponse(AdalTokenRequest.java:87) 
08:39:46 [jsystem] at com.microsoft.aad.adal4j.AuthenticationContext.acquireTokenCommon(AuthenticationContext.java:930) 
08:39:46 [jsystem] at com.microsoft.aad.adal4j.AcquireTokenCallable.execute(AcquireTokenCallable.java:70) 
08:39:46 [jsystem] at com.microsoft.aad.adal4j.AcquireTokenCallable.execute(AcquireTokenCallable.java:38) 
08:39:46 [jsystem] at com.microsoft.aad.adal4j.AdalCallable.call(AdalCallable.java:47) 
08:39:46 [jsystem] at java.util.concurrent.FutureTask.run(Unknown Source) 
08:39:46 [jsystem] at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
08:39:46 [jsystem] at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
08:39:46 [jsystem] at java.lang.Thread.run(Unknown Source) 
08:39:46 [jsystem] Caused by: java.lang.RuntimeException: Could not generate ECDH keypair 
08:39:46 [jsystem] at sun.security.ssl.ECDHKeyExchange$ECDHEPossession.(Unknown Source) 
08:39:46 [jsystem] at sun.security.ssl.ECDHClientKeyExchange$ECDHEClientKeyExchangeProducer.produce(Unknown Source) 
08:39:46 [jsystem] at sun.security.ssl.ClientKeyExchange$ClientKeyExchangeProducer.produce(Unknown Source) 
08:39:46 [jsystem] at sun.security.ssl.SSLHandshake.produce(Unknown Source) 
08:39:46 [jsystem] at sun.security.ssl.ServerHelloDone$ServerHelloDoneConsumer.consume(Unknown Source) 
08:39:46 [jsystem] at sun.security.ssl.SSLHandshake.consume(Unknown Source) 
08:39:46 [jsystem] at sun.security.ssl.HandshakeContext.dispatch(Unknown Source) 
08:39:46 [jsystem] at sun.security.ssl.HandshakeContext.dispatch(Unknown Source) 
08:39:46 [jsystem] at sun.security.ssl.TransportContext.dispatch(Unknown Source) 
08:39:46 [jsystem] at sun.security.ssl.SSLTransport.decode(Unknown Source) 
08:39:46 [jsystem] at sun.security.ssl.SSLSocketImpl.decode(Unknown Source) 
08:39:46 [jsystem] at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(Unknown Source)

标签: javaazureauthenticationssl

解决方案


像这样用你的代码进行测试,它运行良好。请尝试检查代码中的参数,并在 Postman 中进行测试。

import com.microsoft.azure.credentials.ApplicationTokenCredentials;
import com.microsoft.azure.AzureEnvironment;
import com.microsoft.azure.management.Azure;    
import com.microsoft.rest.LogLevel;

......

String CLIENT_ID = "application-id";
String CLIENT_SECRET = "client-secret";
String TENANT = "tenant-id";
String Subscription_id = "subscription-id";

ApplicationTokenCredentials credentials = new ApplicationTokenCredentials(CLIENT_ID, TENANT, CLIENT_SECRET,
        AzureEnvironment.AZURE);
        
try {   
    Azure azure = Azure.configure().withLogLevel(LogLevel.NONE).authenticate(credentials).withSubscription(Subscription_id);
    System.out.println(azure.tenantId());    
} catch (Exception e) {
    e.printStackTrace();
}

依赖项:

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-client-runtime</artifactId>
        <version>1.7.12</version>
    </dependency>

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure-client-authentication</artifactId>
        <version>1.7.12</version>
    </dependency>

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>azure</artifactId>
        <version>1.39.1</version>
    </dependency>

在此处输入图像描述

另一种验证和获取访问令牌的方法。


您的问题中存在错误“java.lang.RuntimeException:无法生成 ECDH 密钥对”。请参考这里


推荐阅读