1

XML ドキュメントにデジタル署名し、2 台の異なるマシンで検証しています (1 つのマシンで署名し、別のマシンで検証しています)。

CSharp.Net で XML DSIG を検証するために、次のことを行っています。

        public static Boolean VerifyXml(XmlDocument document)
        {
            document.PreserveWhitespace = true;
            // Create a new CspParameters object to specify
            // a key container.
            CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";

            // Create a new RSA signing key and save it in the container. 
            //**Earlier was getting exception here in rsaKey object**
            RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);

            // Create a new SignedXml object and pass it
            // the XML document class.
            SignedXml signedXml = new SignedXml(document);

            // Find the "Signature" node and create a new
            // XmlNodeList object.
            // It's guaranteed that there's always exists a signature 
            XmlNodeList nodeList = document.GetElementsByTagName("Signature");

            // Load the <signature> node.  
            signedXml.LoadXml((XmlElement)nodeList[0]);

            // Check the signature and return the result.
            bool isDone = signedXml.CheckSignature(rsaKey); //**This is returning false.**
            return isDone;
        }

最初は、Web アプリケーションがキー コンテナーにアクセスしようとすると、PermissionDenied 例外が発生していました。ただし、一時的にアプリケーション ユーザーと IIS ユーザーを管理者ロールに追加し、CasPol を使用して Web アプリケーションに FullTrust セキュリティ ポリシーを割り当てました。

Q1: [私の最初の質問はこれを克服する最善の方法は何ですか?? Web アプリケーションに fulltrust を割り当て、ユーザーを管理者の役割に追加することは、うまくいきますが、賢明な考えではありません。

私の 2 番目の質問は、signedXml.CheckSignature(rsaKey);false を返すことに関するものです。私の理解によると、XMLドキュメントは別のマシンでデジタル署名されているため、署名に使用されたMACはそのマシンに保存されていますキーコンテナ名「XML_DSIG_RSA_KEY」ですが、ホストマシンで署名を検証しようとすると、別のMACがホスト マシン上のコンテナー名 "XML_DSIG_RSA_KEY" で生成および格納されたため、デジタル署名は検証されませんでした。

Q2: この仮定は正しいですか?? これに対処する最善の方法は何ですか...その場合、証明書を使用して XML ドキュメントにデジタル署名し、それを検証する必要があります。証明書に DSIG XML ドキュメントを添付する必要がありますか????

4

1 に答える 1

4

最初に 2 番目の質問に答えるには: 署名に使用された RSA キー ペアの公開部分を使用して XML を検証する必要があります。そのため、検証マシンで公開鍵をすでに所有している (そして信頼している) か、公開鍵を含む証明書を XML と共に送信し (XML 署名構造内に格納できます)、証明書が有効であることを検証する必要があります。信頼できる認証局によって発行されます。

最初のケースを実装するToXmlString(false)には、送信側でキーを呼び出し、結果をファイルに保存し、このファイルを受信側で保持します。次に、受信側でファイルを読み取り、次のように呼び出します。

RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
rsaKey.ImportFromXml(publicKeyFromFile);

2 番目のケースは、証明書を取得し、次のように署名側の署名に追加することで実行できます。

KeyInfo keyInfo = new KeyInfo();
X509Certificate cert = // load certificate
keyInfo.AddClause(new KeyInfoX509Data(cert));
signedXml.KeyInfo = keyInfo;

証明書が信頼されている場合は、次のように呼び出すだけで、受信側で署名を確認できます。

bool isDone = signedXml.CheckSignature();

最初の質問に答えるには: 秘密鍵ストアにアクセスしようとしなくなったら (以前のように RSACryptoServiceProvider コンストラクターを呼び出して実行していました)、完全な信頼なしで実行できるはずです。

于 2009-07-10T09:07:06.297 に答える