在Azure中拥有一个应用程序服务,并在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(byte [] rawdata,intptr密码,uint32 dwflags,boolean persistkeyset, safecertcontexthandle&pcertctx)at system.security.cryptography.x509certificates.x509certificate.loadcertificatefromblob(byte [] RAWDATA,对象密码,X509Keystorageflags keystorageflags)
由于没有人回答这个问题,所以我会尝试并继续前进。如果我错了,请纠正我,但我认为问题是以下代码行:
new X509Certificate2(Convert.FromBase64String(cerStr), string.Empty, X509KeyStorageFlags.MachineKeySet)
此代码线将尝试在虚拟机的证书存储中添加新证书。运行时使用的所有证书都需要托管在商店的某个地方。这不是一个好主意,因为托管应用程序服务的虚拟机的证书存储不应该存储任何东西,它是基础架构的一部分,当您使用应用程序服务时,这并不关心您的关注。
您需要做的是通过Azure门户上传证书(如果尚未存在)。为此,我最终重复了SSL证书。完成此操作后,您可以在代码中撤回该证书。您将需要在Azure Portal中的"应用程序设置"键下添加一个新的应用程序设置,以供您的应用服务,名为nods_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 Resource Explorer https://resources.azure.com/
正如弗雷德里克(Fredrik
X509Certificate2 x509 = new X509Certificate2(Convert.FromBase64String(cerStr), string.Empty, X509KeyStorageFlags.MachineKeySet)
在Azure WebApp中,如果我们尝试使用证书,则需要从Azure Portal上传证书。在Azure WebApp应用程序中添加带有指纹值的WEBSITE_LOAD_CERTIFICATES
。更多详细信息,请参阅博客。
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();
}