PKCS #7で問題が発生し、頭がおかしくなりました。これが事です:
別のサードパーティ サーバーに要求を送信し、応答として PKCS #7 署名付きトークンを受け取る ASP.NET Web サービスがあります (このトークンがどこから来るかは実際には重要ではありません) 。次に、私の Web サービスはトークンの署名 (および有効性) をチェックし、同封されたデータをメソッドを呼び出したユーザーに返します。
Web サービスは、Windows ADユーザー アカウントIIS 6で実行される専用のアプリケーション プールで実行するように構成されています。
検証を実行するには、次のようにします (署名にはトークンがあります)。
public static byte[] VerifyAndExtractEnvelopedData(byte[] signature) { if (signature == null) throw new ArgumentNullException("signature"); // Decode the signature SignedCms cms = new SignedCms(); cms.Decode(signature); cms.CheckSignature(false); if (cms.Detached) throw new InvalidOperationException("Cannot extract enveloped content from a detached signature."); return cms.ContentInfo.Content; }
Web サービス (IIS 6) をデプロイしました。前述の webmethod を実行しようとすると、署名の検証時に次のエラーが表示されます。
信頼されたルート認証局への証明書チェーンを構築できませんでした
簡単にするために、まったく同じコードで小さな Windows フォーム アプリケーションを作成しました。アプリケーション プールの同じユーザー アカウントを使用して、Web サービスがホストされている同じサーバーに対話的にログインしました。そこで EXE ファイルを実行すると、正常に動作します。つまり、署名を完全に検証できました。IMO、これにより、認証局(CA) 証明書の欠落などの問題が除外されます (実際、署名者の .CER ファイルがあり、Windows で開くと、チェーンに問題がないことがわかります)。
したがって、明らかに唯一の違いは、最初のケースでは私のプロセスが Web サービスであり、2 番目のケースではデスクトップ EXE ファイルであることです。最初のケースで検証を実行できない原因として他に何が考えられますか?