【问题标题】:X509Certificate2.Verify() returns true in console app, false in asp.net web appX509Certificate2.Verify() 在控制台应用程序中返回 true,在 asp.net Web 应用程序中返回 false
【发布时间】:2011-11-10 21:32:05
【问题描述】:

我觉得这与 AppPool 的权限有关,但由于此应用托管在 Azure 中,因此无法更改。

我的代码在控制台应用程序中运行,并且当 AppPool 设置为以用户(我自己)身份运行时。当 AppPool 设置为作为 ApplicationIdentity 运行并且服务托管在 Azure 中时,它无法运行(如果需要,我会发布代码,但我不认为这就是问题所在)。

无论我是从商店、文件还是字节数组加载证书都没有关系。结果是一样的。

我不知道哪些信息有助于诊断此问题,但似乎在降低的权限下无法加载链/路径。调用 .Verify() 在控制台应用程序(以及以我的用户身份运行的 IIS)中返回 true,在 ApplicationIdentity 下返回 false。

证书似乎可以正常加载,并且在这两种情况下都包含私钥。

【问题讨论】:

    标签: azure x509certificate


    【解决方案1】:

    原来我的问题与this question 中列出的问题相同。我需要设置我的证书,以便其中一些位于 CA 和信任部分,以便正确构建链。

    我已经安装了所有证书,但似乎证书的位置也很重要,这与安全性或登录的用户无关!

    【讨论】:

      【解决方案2】:

      您几乎可以在 Azure 中更改任何内容。默认情况下,它是完整的 IIS(如果您不是从 SDK 1.3 或更早版本升级)。有几个选项可以尝试:

      1. (这是错误的!Steve Marx 指出)尝试在提升模式下运行应用程序(在本例中为 IIS AppPool)。这将使 AppPool 在“SYSTEM”帐户下运行,而不是 AppPoolIdentity。您可以通过在 .CSDEF 文件中的角色定义中添加 <runtime executionContext="elevated" /> 元素来做到这一点。

      2. 您可以为所有角色启用远程桌面。这将有效地在您的角色实例中创建一个帐户并将其添加到管理员组。然后,您可以使用启动任务和 powershell 脚本更改 AppPool 身份以使用该帐户:A blog post by Wade Wegner on how to programatically change AppPool Identity

      嗯,这些都是使您的应用程序池在提升模式下运行的方法,但也表明您可以在 Windows Azure 实例上使用 IIS 完成几乎所有事情。我建议仅出于测试目的使用以提升模式运行的站点。首先让您的代码在本地 IIS 上的受限帐户中运行。然后查看您所做的更改以使其在本地工作并将这些更改应用到 Azure Web 角色。

      编辑

      要注意的另一件事是,为了使 .Verify() 工作,您必须在 Web 角色上安装颁发已检查证书的 CA 的根证书。这可以通过从管理门户添加根 CA 证书作为“服务证书”来完成。此外,颁发检查证书的 CA 必须是可信的。

      【讨论】:

      • #1 是错误的。运行提升的 Web 角色对用于应用程序池的标识没有影响。 (IIS 仍将使用网络服务。)它只会更改用于运行 RoleEntryPoint 代码的身份。
      • 我认为最有可能的问题是您提到的证书的信任链已损坏。在您的本地计算机上,在证书管理器中打开证书并检查证书路径选项卡,它将在证书上方显示一些内容。 RDP 进入 azure 机器并检查相同,它可能会丢失 CA 或其变体。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 2011-08-27
      • 2011-11-12
      相关资源
      最近更新 更多