从Azure Blob保存X509证书并在Azure网站中使用它

时间:2014-09-06 06:15:23

标签: azure azure-storage-blobs azure-web-sites x509certificate2

我有一个Azure网站和Azure Blob,我用它来存储 .cer X509证书文件。

目标是从blob获取 .cer 文件并使用它来执行操作(其代码在我的Azure网站的Controller中,并且可以正常运行)

当我在本地运行代码(不发布我的网站)时,它可以工作,因为我将其保存在D:\

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]);

// Create the blob client. 
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

// Retrieve reference to a previously created container.
CloudBlobContainer container = blobClient.GetContainerReference("myContainer");

// Retrieve reference to a blob named "testcert.cer".
CloudBlockBlob blockBlob = container.GetBlockBlobReference("testcert.cer");

// Save blob contents to a file.
using (var fileStream = System.IO.File.OpenWrite("D:/testcert.cer"))
{
    blockBlob.DownloadToStream(fileStream);
}


 **string certLocation = "D:/testcert.cer";
 X509Certificate2 myCert = new X509Certificate2();

 myCert.Import(certLocation);**

我无法弄清楚如何/在哪里可以保存它。如果我尝试使用Import方法但输入一个url(存储证书的Azure blob的url),我会收到一个错误,因为Import无法处理网址。

知道我可以在Azure网站或blob中用作临时存储,并从中创建X509Certificate吗?

修改:我试图添加有关我试图解决的问题的更多详细信息。

  1. 从Azure blob获取证书文件并将其写入Azure网站。

  2. 使用string pathToCert对象上的.Import(X509Certificate)来创建证书,该证书将用于以我在控制器中编写的方法进行呼叫。

  3. 我已经能够通过FTP手动将.cer文件添加到我网站的wwwroot文件夹中来解决1。但现在,当我使用Server.MapPath("~/testcert.cer");获取证书路径时,我得到了这个:D:\home\site\wwwroot\testcert.cer

    显然,当Import方法将上面的字符串作为路径部署到我的azure网站时,它不是有效路径,因此我的证书创建失败。

    有什么想法吗?谢谢!

3 个答案:

答案 0 :(得分:5)

在本地保存证书对于Azure来说通常是禁止的,你已经获得了BlobStorage。

使用Import(byte [])重载将证书保存并加载到内存中。这是一个快速的手动编码尝试......

  // Used to store the certificate data
  byte[] certData;
  // Save blob contents to a memorystream.
  using (var stream = new MemoryStream())
  {
        blockBlob.DownloadToStream(stream);
        certData = stream.ToArray();
  }

  X509Certificate2 myCert = new X509Certificate2();
  // Import from the byte array
  myCert.Import(certData);

答案 1 :(得分:0)

很简单。答案涵盖了所有和任何网络托管商,而不仅仅是Azure。

首先,我强烈建议您永远静态地将路径放到Web项目中的文件夹中!然后你可以做的是:

  1. 使用Server.MapPath("~/certs")方法获取网站根文件夹中certs文件夹的物理路径。
  2. 确保没有人可以从外部世界访问此文件夹:
  3. Location Deny content

    通过在web.config中添加此额外的location部分,您将阻止对此文件夹的任何外部访问。请注意,location元素必须是web.config文件中根configuration元素的直接后代。

    UPDATE ,关于如何将文件写入ASP.NET Web项目的本地文件系统的非天蓝相关部分:

    var path = Server.MapPath("~/certs"); 
    using (var fileStream = System.IO.File.OpenWrite(path + "\testcert.cer")) 
    {
      // here use the fileStream to write
    }
    

    有关如何使用Blob Stroage客户端将blob内容写入本地文件的完整示例代码:

    var path = Server.MapPath("~/certs");  
    using (var fileStream = System.IO.File.OpenWrite(path + "\testcert.cer"))  
    {   
        blockBlob.DownloadToStream(fileStream ); 
    }
    

    但是,@ SeanCocteau有一个好点和更简单的方法 - 只需使用MemoryStream

答案 2 :(得分:0)

您现在可以通过门户网站上传您的证书,为您的网站添加应用设置,并将证书显示在您网站的证书存储区中。

有关详细信息,请参阅此博文: http://azure.microsoft.com/blog/2014/10/27/using-certificates-in-azure-websites-applications/