0

ClickOnce配置マニフェストを動的に生成して署名するために使用しているThawteからのコード署名証明書を取得しました。問題は、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ブランチに到達し、それは正しくありません。証明書は、アプリケーションプールユーザーの「CurrentUser\Personal」証明書ストアにあります。

質問:証明書が突然「消える」か、見つからないのはなぜですか?

4

1 に答える 1

1

私たち自身で(痛々しいほど)それを理解しました。

証明書をLocalMachineストアにインストールする必要があり、ASP.NETアプリケーションから使用する場合は、アプリケーションプールアカウントがWinHttpCertCfgまたはCACLS.exeを使用して証明書への読み取りアクセス許可を取得します。アプリケーションプールを実行しているアカウントのCurrentUserストアを使用すると、問題が発生していました。インタラクティブなログオンセッションで実行されていないユーザーからCurrentUserストアにアクセスすることについて、ある種の競合状態または完全にクールではない何かがあると思います。

ClickOnce配置マニフェストの作成/署名を行うためにMAGEツールを呼び出していたため、最初はこれを行うことができませんでした。これには、コード署名証明書がCurrentUser\Myストアにある必要があります。ただし、a)テンプレートファイルからマニフェストを作成して置換する必要のある値を置き換えること、およびb)BuildTasksに存在するリフレクションを介してMAGEが呼び出すコードを呼び出してマニフェストに署名することにより、MAGEの必要性を排除しました。 v3.5DLL。その結果、マニフェストに署名するために使用する証明書をより細かく制御でき、必要な場所に配置できます。そうでなければ、私たちが少し「より低いレベル」に行かなければ、私たちは立ち往生していたでしょう。

于 2011-08-18T22:24:58.247 に答える