我有一个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
吗?
修改:我试图添加有关我试图解决的问题的更多详细信息。
从Azure blob获取证书文件并将其写入Azure网站。
使用string pathToCert
对象上的.Import(X509Certificate
)来创建证书,该证书将用于以我在控制器中编写的方法进行呼叫。
我已经能够通过FTP手动将.cer
文件添加到我网站的wwwroot文件夹中来解决1。但现在,当我使用Server.MapPath("~/testcert.cer");
获取证书路径时,我得到了这个:D:\home\site\wwwroot\testcert.cer
显然,当Import方法将上面的字符串作为路径部署到我的azure网站时,它不是有效路径,因此我的证书创建失败。
有什么想法吗?谢谢!
答案 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项目中的文件夹中!然后你可以做的是:
Server.MapPath("~/certs")
方法获取网站根文件夹中certs
文件夹的物理路径。
通过在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/