在Azure Web Sites中访问已上传的证书

28

当我使用Web角色时,我只需在Azure门户上传证书,就可以看到它。现在我已经切换到Azure中的网站,并在Azure管理门户中上传了证书,但我的代码根本看不到它。

我们需要进行一些配置或其他方式来访问在Azure网站上上传的证书吗?

这是我尝试访问已上传证书的方式。

private List<string> GetAvailableCertificatesFromStore()
{
    var list = new List<string>();
    var store = new X509Store(StoreName.My,StoreLocation.LocalMachine);
    store.Open(OpenFlags.ReadOnly);

    try
    {
        foreach (var cert in store.Certificates)
        {
            // todo: add friendly name
            list.Add(string.Format("{0}", cert.Subject));
        }
    }
    finally
    {
        store.Close();
    }

    return list;
}
2个回答

82

在Azure WebSite中使用证书与在本地复制的IIS或通过Visual Studio从调试模式运行网站工作方式不同。简而言之,网站不能以传统意义上的证书存储为基础来访问证书...这一切都是在内存中完成。

首先,在通过Azure门户上传证书后,您需要添加一个名为WEBSITE_LOAD_CERTIFICATES的应用设置(也通过门户)并将其值设置为已上传证书的指纹。如果需要,这可以是多个指纹的逗号分隔列表,甚至*以加载所有已上传的证书。我假设这迫使证书加载到内存中。

然后,您可以执行以下操作来加载证书:

var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);

var certs = store.Certificates.Find(X509FindType.FindByThumbprint, YOUR_THUMBPRINT, false);

如果您想确保证书有效,请将“false”更改为“true”。

我在这里找到了这些信息,其中比我更好地解释了它:http://azure.microsoft.com/blog/2014/10/27/using-certificates-in-azure-websites-applications/


1
该死。花了三个小时,我的参数名称不同(不是WEBSITE_LOAD_CERTIFICATES)。谢谢。 - Ilya Schukin
3
经过几天的努力,我发现问题出在 StoreLocation.CurrentUser 而不是 StoreLocation.LocalMachine! - omeralper
2
我无法使用上述代码读取私钥,有人能帮忙吗?我正在尝试读取私钥以用于解密数据。我甚至尝试了 cert.PrivateKey.ToXmlString(true) - Saravanan
4
如果你正在使用指纹列表但仍然无法正常工作,你应该检查字符串中是否有不可见字符。我刚刚发现我的一个列出的指纹中有一个0x200E字符。服务器错误非常恼人,因为一切看起来都正确。问题实际上是看不见的! 如果你将这些应用程序设置存储在web.config中,你可以在Kudu控制台中为该Web应用程序发现服务器上的不可见字符存在。不可见字符显示为非常小的灰色点。 - Taul
4
有趣的是,WEBSITE_LOAD_CERTIFICATES 必须通过门户中的 应用程序设置 添加(如果在 Web.config 中添加将无效)。 - Thibault D.

11

更新 - 2015年7月23日:此答案现已过时(但在提供答案时是正确的)。请查看S Armstrong下面的答案。

Azure Cloud Services(Web / Worker Roles)Azure Websites的工作方式不同。在Azure Cloud Services中,当您通过管理门户上传证书并在角色属性中指定该证书的Thumbprint和安装位置时,当您的角色在VM中部署时,负责它的Fabric Controller也会自动为您安装这些证书。这就是上面的代码在Web角色中起作用的原因。

对于网站,您需要自己处理此问题。不幸的是,在Azure网站中由于安全限制,您不能只将证书安装在证书存储中。要使用证书,您需要将证书的PFX文件与代码一起包含并使用该证书文件。您无法将证书安装在证书存储中。

在我所做的少量关于Azure网站和证书的工作中,我发现只有在AppData文件夹中包含PFX文件时,证书才能正常工作。您可能会遇到像“CryptographicException:系统找不到指定的文件”之类的错误。如果您遇到此错误,则可以查看此博客文章:http://blog.tylerdoerksen.com/2013/08/23/pfx-certificate-files-and-windows-azure-websites/


据我所知,你是100%正确的。通过门户上传的证书甚至没有安装到存储中。它们似乎是通过某些其他方式在IIS启动期间加载到内存中的。 - Adrian Hope-Bailie
3
这个回答已经过时,请查看下面S.Armstrong的回答。 - Zain Rizvi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接