我正在尝试在我的Azure网站中安装一个自签名证书,然后使用它访问Azure密钥库
当我在本地运行代码并从StoreLocation.CurrentUser&StoreName。我的一切都如预期
尝试在我在Azure中部署的站点中运行相同的代码,但失败了
当我将读取更改为使用StoreLocation.LocalMachine时,加载证书时不带私钥,这会导致异常:
"System.NotSupportedException:X.509证书中不存在私钥">
是否需要以不同方式加载证书?或者我一开始没有在Azure中正确安装它
以下是我执行的安装步骤:
1。转到https://ms.portal.azure.com
2。选择我的资源(我的网站的应用程序服务)
3。单击"SSL证书">
4。单击"上载证书">
5。单击浏览,选择我的pfx文件并提供密码
6。单击"上载">
这是我用来读取和使用证书的代码:
// C-tor
public SecretRetriever(string thumbprint, string clientId)
{
var clientAssertionCertPfx = FindCertificateByThumbprint(thumbprint);
this.AssertionCert = new ClientAssertionCertificate(clientId, clientAssertionCertPfx);
}
/// <summary>
/// Get the certificate associated with the given secretId
/// </summary>
/// <param name="secretId"></param>
/// <returns></returns>
public async Task<string> GetSecretAsync(string secretId)
{
var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetAccessTokenAsync));
return (await kv.GetSecretAsync(secretId)).Value;
}
private async Task<string> GetAccessTokenAsync(string authority, string resource, string scope)
{
var context = new AuthenticationContext(authority, TokenCache.DefaultShared);
var result = await context.AcquireTokenAsync(resource, AssertionCert);
return result.AccessToken;
}
//when changing to "CurrentUser" the private key is in the certificate. why it is not there when reading from LocalMachine?
private static X509Certificate2 FindCertificateByThumbprint(string findValue)
{
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
try
{
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection col = store.Certificates.Find(X509FindType.FindByThumbprint, findValue, false);
if (col.Count == 0)
{
return null;
}
return col[0];
}
finally
{
store.Close();
}
}
为了解决这个问题,我必须授予我的站点访问证书的权限
这是通过转到Azure门户-->设置-->应用程序设置中的应用程序来实现的
我添加了以下应用程序设置:
密钥:WEBSITE_LOAD_CERTIFICATES,值:My_Certificate_Tumbprint
(感谢您为我指明了正确的方向,Crypt32)