存储在证书库中的证书随着时间的推移从ASP.NET应用程序中消失

时间:2011-08-18 01:48:07

标签: asp.net clickonce x509certificate2

我从Thawte获得了一个代码签名证书,我用它来动态生成和签署ClickOnce部署清单。问题是,当我们重新启动IIS或重新导入签名证书时,生成并签署这些清单的ASP.NET应用程序工作正常,但随着时间的推移,以下函数无法找到证书:

private static X509Certificate2 GetSigningCertificate(string thumbprint)
{
    X509Store x509Store = new X509Store(StoreLocation.CurrentUser);
    try
    {
        x509Store.Open(OpenFlags.ReadOnly);
        X509Certificate2Collection x509Certificate2Collection = x509Store.Certificates.Find(
            X509FindType.FindByThumbprint, thumbprint, false);

        if (x509Certificate2Collection.Count == 0)
            throw new ApplicationException(
                "SigningThumbprint returned 0 results.  Does the code signing certificate exist in the personal store?",
                null);

        if (x509Certificate2Collection.Count > 1)
            throw new ApplicationException(
                "SigningThumbprint returned more than 1 result.  This isn't possible", null);

        var retval = x509Certificate2Collection[0];

        if(retval.PrivateKey.GetType() != typeof(RSACryptoServiceProvider))
            throw new ApplicationException("Only RSA certificates are allowed for code signing");

        return retval;
    }
    finally
    {
        x509Store.Close();
    }
}

最终,应用程序开始抛出无法找到证书的错误。我很难过,因为我认为证书安装正确(或大部分是正确的),因为它在我们启动ASP.NET应用程序时确实找到了证书,但是在某些时候我们点击了Count == 0分支并且它不是真的:证书位于应用程序池用户的“当前用户\个人”证书库中。

问题:为什么证书突然“消失”或无法被发现?

1 个答案:

答案 0 :(得分:1)

自己想出来(痛苦地)。

证书需要安装在LocalMachine商店中,并且应用程序池帐户使用WinHttpCertCfg或CACLS.exe读取证书的权限(如果要从ASP.NET应用程序使用它)。使用运行应用程序池的帐户的CurrentUser存储导致问题。我猜测存在某种竞争条件,或者从未在交互式登录会话中运行的用户访问CurrentUser商店并不是很酷。

我们最初无法执行此操作,因为我们正在调用MAGE工具来执行ClickOnce部署清单创建/签名,并且需要代码签名证书位于CurrentUser \ My store中。但是,我们通过以下方式消除了对MAGE的需求:a)从模板文件创建清单并替换我们需要替换的值,以及b)通过在BuildTasks中通过反射调用代码MAGE调用来对清单进行签名。 v3.5 DLL。因此,我们可以更好地控制我们用于签署清单的证书,并将其放在我们想要的任何地方。否则,如果我们没有走“低级别”,我们就会陷入困境。