inv*_*rel 4 c# azure x509certificate2 azure-cloud-services azure-keyvault
我在Azure中有一个作为经典云服务运行的工作进程。此过程需要从Azure密钥保管库检索值,并且我需要在我的源树之外将保管库身份验证保密。
传统的云工作者似乎无法使用托管身份,因此我正在查看证书。通过创建证书然后在Azure Active Directory中上载我的应用程序注册,我已经通过证书进行了身份验证以在本地工作:
证书创建:
New-SelfSignedCertificate -Subject "CN=MyFineCertificate" -CertStoreLocation "Cert:\CurrentUser\My" -KeyExportPolicy Exportable -KeySpec Signature
Run Code Online (Sandbox Code Playgroud)
使用它连接到密钥库的代码(在本地工作):
private static KeyVaultClient GetClient()
{
var certificate = GetCertificate();
var assertion = new ClientAssertionCertificate(clientId, certificate);
var client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback((a, r, s) => GetAccessTokenUsingCert(a, r, s, assertion)));
return client;
}
private static X509Certificate2 GetCertificate()
{
var certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certStore.Open(OpenFlags.ReadOnly);
var results = certStore.Certificates.Find(/* criteria */);
return results[0];
}
private static async Task<string> GetAccessToken(string authority, string resource, string scope, ClientAssertionCertificate cert)
{
var authContext = new AuthenticationContext(authority, TokenCache.DefaultShared);
var result = await authContext.AcquireTokenAsync(resource, cert);
return result.AccessToken;
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好。但是,我希望我的Azure云工作者执行此操作,因此我需要那里的证书。我的天真的假设是,我可以从门户中云工作者的“证书”面板中上传证书(pfx)。
不幸的是,我的云工作者无法找到它。如果我在Azure上运行此文件,则在上传证书后,它不会显示:
foreach (StoreName name in Enum.GetValues(typeof(StoreName)))
{
foreach (StoreLocation location in Enum.GetValues(typeof(StoreLocation)))
{
var certStore = new X509Store(name, location);
certStore.Open(OpenFlags.ReadOnly);
foreach (var res in certStore.Certificates)
{
/* log certificate */
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么不显示?我是否在正确的轨道上,还是完全误解了它的工作原理?
您的问题分为两部分:
方法 -由于托管服务身份不适用于Cloud Services,因此如何使用Azure Key Vault工作/进行身份验证?
您走在正确的轨道上。我已在本SO Post- 在Azure云服务配置中保护敏感信息中描述了与Key Vault一起使用的类似问题的方法
实施 -特别是如何从云服务角色实例访问自签名证书。
我认为您可能缺少指定证书及其在云服务定义和配置文件中的位置。您应该尝试添加这样的内容-
中国计算机学会
<Certificates>
<Certificate name="MyFineCertificate" thumbprint="<my_thumbprint>" thumbprintAlgorithm="<my_thumbprint_algo e.g. sha1>" />
</Certificates>
Run Code Online (Sandbox Code Playgroud)
中国科学技术发展基金会
<Certificates>
<Certificate name="MyFineCertificate" storeLocation="LocalMachine" storeName="My" />
</Certificates>
Run Code Online (Sandbox Code Playgroud)
注意,我提到的商店位置是LocalMachine。现在,您应该能够通过指定正确的位置从代码中访问证书。
var certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
200 次 |
| 最近记录: |