【问题标题】:Accessing uploaded certificates in azure web sites在 azure 网站中访问上传的证书
【发布时间】:2014-07-12 17:36:56
【问题描述】:

当我使用网络角色时,我只是在 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;
}

【问题讨论】:

    标签: c# azure ssl-certificate x509certificate azure-web-app-service


    【解决方案1】:

    在 Azure 网站中使用证书与在 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/

    【讨论】:

    • 该死的。花了大概3个小时。我的参数名称不同(不是 WEBSITE_LOAD_CERTIFICATES)。谢谢
    • 花了几天后,我发现问题是 StoreLocation.CurrentUser 而不是 StoreLocation.LocalMachine !
    • 我无法使用上面的代码读取私钥,任何人都可以帮助解决这个问题。我正在尝试读取用于解密数据的私钥。我什至尝试了cert.PrivateKey.ToXmlString(true)
    • 仅供参考,如果您使用的是指纹列表但仍然无法正常工作,您应该检查字符串是否有不可见字符。我刚刚发现我列出的一个指纹中有一个 0x200E 字符。服务器错误令人愤怒,因为一切看起来都是正确的。这个问题实际上是看不见的!如果您将其中一些应用程序设置存储在 web.config 中,您可以在该 Web 应用程序的 Kudu 控制台中发现服务器上存在不可见字符。隐形字符显示为一个非常小的灰色点。
    • 奇怪的是,WEBSITE_LOAD_CERTIFICATES 必须通过门户中的 Application settings 添加(如果将其添加到 Web.config 中则不起作用)
    【解决方案2】:

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

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

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

    在我对 Azure 网站和证书所做的任何小工作中,我发现证书只有在 PFX 文件包含在 AppData 文件夹中时才有效。此外,您可能会遇到CryptographicException: The system cannot find the file specified 之类的错误。如果您遇到此错误,您可能会发现这篇博文很有用:http://blog.tylerdoerksen.com/2013/08/23/pfx-certificate-files-and-windows-azure-websites/

    【讨论】:

    • 据我所知,你是 100% 正确的。通过门户上传的证书甚至没有安装到商店中。它们似乎在 IIS 启动期间通过其他方式加载到内存中。
    • 这个答案已经过时了。请参阅下面 S.Armstrong 的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 2016-07-01
    相关资源
    最近更新 更多