2

我有一个Azure网站和一个Azure Blob,我正用它来存储.cer X509证书文件。从Azure Blob保存X509证书并在Azure网站中使用它

目标是从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无法处理url。

任何想法,我可以用作在Azure网站或blob的临时存储,并从它创建一个X509Certificate

编辑:我想添加更多关于我试图解决的问题的细节。

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

  2. 使用X509Certificate对象创建将被用来在我写在我的控制器的方法的调用证书上.IMPORT(string pathToCert)。

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

显然,当导入方法使用上面,因为一旦它部署到我的蔚蓝网站的路径字符串,它不是一个有效的路径,因此我证书创建失败。

任何想法?谢谢!

+0

关注此空间:在Azure的网站进行交接证书更好地支持即将推出:) – 2014-09-08 18:26:28

回答

0

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

首先,我强烈建议你永远不要静态地把你的Web项目中的文件夹的路径!那么你可以做的是:

  1. 用户Server.MapPath("~/certs")方法来获得你的网站的根目录文件夹内的文件夹certs的物理路径。
  2. 确保没有人可以从外界访问此文件夹:

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 
} 

,并就如何使用斑点Stroage客户一个完整的示例代码写一个blob的内容到本地文件:

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

但是,@SeanCocteau好点的更简单的方法 - 只要使用MemoryStream,而不是!

+0

感谢您的回答!我知道我可以使用Server.MapPath(“〜/ certs”)从根文件夹获取证书。我如何在首位保存证书?我应该将OpenWrite(“路径”)更改为? //将blob内容保存到文件中。 (var fileStream = System.IO.File.OpenWrite(“D:/testcert.cer”)) { blockBlob.DownloadToStream(fileStream); } – Order66 2014-09-06 09:07:04

+2

var path = Server.MapPath(“〜/ certs”); using(var fileStream = System.IO.File.OpenWrite(path +“\ testcert.cer”)) – 2014-09-07 11:43:53

4

在本地保存证书通常是Azure的禁止,您已为此获取BlobStorage。

使用导入(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);