Azure,App-service,从字符串

时间:2017-03-01 13:29:57

标签: c# azure azure-web-sites x509certificate x509certificate2

在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)

2 个答案:

答案 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();
    }