java - 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)
解决方案
像这样用你的代码进行测试,它运行良好。请尝试检查代码中的参数,并在 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 密钥对”。请参考这里。
推荐阅读
- java - 从包含特定字符的字符串中删除行
- java - 如何通过两个步骤使 java Mail 类在邮件中对我进行身份验证
- angular - 角度更新 10.2 到 11
- python - Scrapy/Python:在产生的请求完成后运行逻辑
- c++ - 当计算机在我的代码中要求输入数组中存在的键时,如何打印“数组中不存在键(元素)”
- user-interface - 带有 GUI 界面的 ACL 管理
- javascript - 以动态形式隐藏空输入
- javascript - 类不是 Safari(iOS 和 MacOS)中新事件的构造函数
- react-native - 管理推送通知
- python - 无法从传输连接中读取数据 - 来自 python 的 C# 端口