1

ac# .net 3.5 アプリケーションを開発しています (anycpu にコンパイル)

実行可能ファイルに署名する必要があります。ここのコードをいくつか変更して使用しようとしました。ストアで証明書を検索せず、代わりに pfx ファイルから読み込みました。

  var cert = new X509Certificate2("myCert.pfx", "pass");

メソッドの記号を次のように変更します。

  public static void Sign(string appPath, X509Certificate2 cert)
    {
        var pSignerCert = IntPtr.Zero;
        var pSubjectInfo = IntPtr.Zero;
        var pSignatureInfo = IntPtr.Zero;
        var pProviderInfo = IntPtr.Zero;


        pSignerCert = CreateSignerCert(cert);
        pSubjectInfo = CreateSignerSubjectInfo(appPath);
        pSignatureInfo = CreateSignerSignatureInfo();
        pProviderInfo = GetProviderInfo(cert);

           var hResult = NativeMethods.SignerSign(
                pSubjectInfo,
                pSignerCert,
                pSignatureInfo,
                pProviderInfo,
                null,
                IntPtr.Zero,
                IntPtr.Zero
                );

        Console.WriteLine(hResult);
    }

そして、次のようなプロバイダー情報を取得しています:

  private static IntPtr GetProviderInfo(X509Certificate2 cert)
    {
        if (cert == null || !cert.HasPrivateKey)
        {
            return IntPtr.Zero;
        }

        var key = cert.PublicKey.Key as ICspAsymmetricAlgorithm;
        if (key == null)
        {
            return IntPtr.Zero;
        }

        var providerInfo = new SignerProviderInfo
                               {
                                   cbSize = (uint)Marshal.SizeOf(typeof(SignerProviderInfo)),
                                   pwszProviderName = "Microsoft Enhanced Cryptographic Provider v1.0",
                                   dwProviderType = 0x1,
                                   // PROV_RSA_FULL
                                   dwKeySpec = 0x0,
                                   dwPvkChoice = 0x2, //PVK_TYPE_KEYCONTAINER
                                   providerUnion = new SignerProviderInfo.ProviderInfoUnion
                                                       {
                                                           pwszKeyContainer = key.CspKeyContainerInfo.KeyContainerName
                                                       },
                               };
        var pProviderInfo = Marshal.AllocHGlobal(Marshal.SizeOf(providerInfo));
        Marshal.StructureToPtr(providerInfo, pProviderInfo, false);

        return pProviderInfo;
    }

問題は、一部のマシンでは完全に正常に動作することですが、他のマシンでは次のエラーが発生することです: エラー コード 0x80092006 - ストアまたはオブジェクトにプロバイダーが指定されていません。

同じ pfx ファイルで SignTool.exe を使用しようとしましたが、正常に動作します。

この動作の原因を調査しようとしましたが、このエラーが発生している理由についてのヒントは見つかりませんでした。

なぜそれが起こるのか誰か知っていますか?

4

1 に答える 1