Azure KeyVaultClient:使用Java中的证书进行身份验证
问题描述:
我正尝试从pfx证书中的Azure Java SDK
创建KeyVaultClient
对象。我发现了一个关于如何在C#中做到这一点的清晰文档,但必须知道如何在Java中执行此操作。Azure KeyVaultClient:使用Java中的证书进行身份验证
我能够从用户帐户keystore
获得Windows证书,但我真的不知道要传递给KeyVaultClient
构造函数的内容。它看起来像接受TokenCredentials
类型的对象,但是我找不到任何有关如何实际构建其中一个(需要“标记”和“方案”)的文档。
答
看来我靠近有一些工作定义这个类:
class WindowsStoreCertificateCredentials(clientId: String, certificate: X509Certificate, privateKey: PrivateKey) extends KeyVaultCredentials {
def getAuthResult(authority: String, resource: String): AuthenticationResult = {
val service = Executors.newFixedThreadPool(1)
val context = new AuthenticationContext(authority, false, service)
val certificateCredentials = AsymmetricKeyCredential.create(clientId, privateKey, certificate)
val authResultFuture = context.acquireToken(resource, certificateCredentials, null)
authResultFuture.get
}
override def doAuthenticate (authority: String, resource: String, scope: String): String = {
getAuthResult(authority, resource).getAccessToken
}
}
,并试图用它获得使用java.security.KeyStore中的证书X509Certificate对象和私钥后:
val client = new KeyVaultClient(new WindowsStoreCertificateCredentials(
id, privateKey, certificate,))
val test = client.getSecret("https:/...")
不幸的是,引发一个异常:
sun.security.mscapi.RSAPrivateKey cannot be cast to java.security.interfaces.RSAPrivateKey java.lang.ClassCastException: sun.security.mscapi.RSAPrivateKey cannot be cast to java.security.interfaces.RSAPrivateKey
我在GitHub上AzureAD打开一个问题/蔚的ActiveDirectory库换java和建议pull请求解决它,未完待续......
编辑:这是现在固定在AzureAD的版本1.2.0/azure-activedirectory-library-for-java。
答
这听起来像你想知道如何使用Azure的SDK的Java创建通过与所需的参数ServiceClientCredentials credentials
构造方法的KeyVaultClient
对象,作为javadoc说。
这是我的示例代码。
import com.microsoft.azure.AzureEnvironment;
import com.microsoft.azure.CloudException;
import com.microsoft.azure.credentials.ApplicationTokenCredentials;
import com.microsoft.azure.keyvault.KeyVaultClient;
import com.microsoft.azure.management.Azure;
import com.microsoft.rest.credentials.ServiceClientCredentials;
String clientId = "xxxx";
String domain = "xxxx"; // The same as tenant_id
String secret = "xxxx"; // The same as client_secret or keys
AzureEnvironment environment = AzureEnvironment.AZURE;
ServiceClientCredentials credentials = new ApplicationTokenCredentials(clientId, domain, secret, environment);
// New a KeyVaultClient object
KeyVaultClient kvClient = new KeyValutClient(credentials);
为参照,你可以参考在Azure官方document得到的参数clientId
,domain
& secret
在Azure管理门户。为天青的Java SDK的API的更多细节,请查看javadocs
它看起来像我不能使用这个构造函数,因为我没有后面的Azure应用程序。要特别指向Azure文档:我正在尝试执行与https://docs.microsoft.com/zh-CN/azure/key-vault/key-vault-use-from-web-application中的相同的第“使用证书进行身份验证而不是客户端秘密“。 – CanardMoussant