在Azure中使用App-service并使用AzureServiceManagementAPI,我正在下载包含每个订阅的managememnt证书的文件。
如何使用文件中的证书字符串尝试创建 X509Certificate2 对象。
string cerStr = subscription.Attribute("ManagementCertificate").Value;
X509Certificate2 x509 = new X509Certificate2(Convert.FromBase64String(cerStr), string.Empty, X509KeyStorageFlags.MachineKeySet)
X509Certificate2的构造函数抛出异常
拒绝访问。
System.Security.Cryptography.CryptographicException.ThrowCryptographicException(的Int32 hr)at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(字节[] rawData,IntPtr密码,UInt32 dwFlags,布尔persistKeySet, SafeCertContextHandle&安培; pCertCtx)at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(字节[] rawData,Object password,X509KeyStorageFlags keyStorageFlags)
答案 0 :(得分:0)
由于没有人回答过这个问题,我会尽力去做。如果我错了,请纠正我,但我认为问题是以下代码行:
new X509Certificate2(Convert.FromBase64String(cerStr), string.Empty, X509KeyStorageFlags.MachineKeySet)
此代码行将尝试将新证书添加到虚拟机的证书存储中。运行时使用的所有证书都需要托管在某个商店中。这不是一个好主意,因为托管应用程序服务的虚拟机的证书存储区不应该存储任何内容,它是您在使用应用程序服务时不关心的基础结构的一部分。
您需要做的是通过天蓝色门户网站上传证书(如果它们尚未存在)。为此,我最终重新使用了已经存在的SSL证书。完成后,您可以在代码中检索该证书。您需要在Azure门户中的“应用程序设置”键下为您的应用程序服务添加一个新的应用程序设置,名为WEBSITE_LOAD_CERTIFICATES。该值应该是证书的指纹。
要检索证书,您应该执行以下操作:
public async Task<X509Certificate2> GetCertificate(string certificateThumbprint)
{
var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var cert = store.Certificates.OfType<X509Certificate2>()
.FirstOrDefault(x => x.Thumbprint == certificateThumbprint);
store.Close();
return cert;
}
您可以使用azure资源管理器https://resources.azure.com/
导航订阅,从而获得证书的指纹答案 1 :(得分:0)
正如Fredrik所说,问题是由于代码
X509Certificate2 x509 = new X509Certificate2(Convert.FromBase64String(cerStr), string.Empty, X509KeyStorageFlags.MachineKeySet)
在Azure WebApp中,如果我们尝试使用证书,则需要从Azure门户上载证书。在Azure WebApp应用程序中添加带有指纹值的WEBSITE_LOAD_CERTIFICATES
。更多详细信息请参阅blog。
访问证书的Web应用程序,来自博客的代码段
static void Main(string[] args)
{
X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certStore.Open(OpenFlags.ReadOnly);
X509Certificate2Collection certCollection = certStore.Certificates.Find(
X509FindType.FindByThumbprint,
// Replace below with your cert's thumbprint
“E661583E8FABEF4C0BEF694CBC41C28FB81CD870”,
false);
// Get the first cert with the thumbprint
if (certCollection.Count > 0)
{
X509Certificate2 cert = certCollection[0];
// Use certificate
Console.WriteLine(cert.FriendlyName);
}
certStore.Close();
}