5

SignedXmlクラスを使用してC#でXml(実際にはSOAP xml)に署名しようとしていますが、署名段階は正常に通過しますが、署名を検証しようとすると、無効であると表示されます。トランスフォームXmlDsigEnvelopedSignatureTransformの代わりにXmlDsigExcC14NTransformを使用した、MSDNの例から行った唯一の変更。XmlDsigEnvelopedSignatureTransformを使用すると、有効な署名が取得されます。

これが私の署名コードです:

 private static XmlDocument SignXml(XmlDocument doc)
             {
                 SignedXml signedXml = new SignedXml(doc);
                 signedXml.SigningKey = Certificate.PrivateKey;
    
                 Reference reference = new Reference();
                 reference.Uri = "";
                 
                 XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
                 //XmlDsigExcC14NTransform env = new XmlDsigExcC14NTransform();

                 reference.AddTransform(env);
    
                 signedXml.AddReference(reference);
                 signedXml.ComputeSignature();
    
                 XmlElement signature = signedXml.GetXml();
                 doc.DocumentElement.AppendChild(signature);
                 doc.Save(SignedXmlPath);
                 return doc;
             }

上記のコードは私に有効な署名を与えますが、私が使用する場合

XmlDsigExcC14NTransform env = new XmlDsigExcC14NTransform();

それ以外の

XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();

無効な署名を取得します。

これが私の確認コードです:

private static bool Verify(XmlDocument doc)
        {
            SignedXml signedDoc = new SignedXml(doc);
            XmlNodeList nodeList = doc.GetElementsByTagName(Constants.SignatureElement);

            signedDoc.LoadXml((XmlElement)nodeList[0]);
            return signedDoc.CheckSignature((RSA)Certificate.PublicKey.Key);
        }

の変換アルゴリズムで署名する方法を教えてもらえますかhttp://www.w3.org/2001/10/xml-exc-c14n#

前もって感謝します。

4

1 に答える 1

10

XmlDsigEnvelopedSignatureTransform署名する要素内に署名を追加するため、この場合はが必要になります。

XmlDsigEnvelopedSignatureTransformSignedXml有効性をテストする前に、署名ノード自体から署名を削除するようにクラスに指示します。これが必要なのは、署名の計算後にその要素を追加したためです。

AddTransform次のようにもう一度呼び出すことで、複数の変換を追加できます。

XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
XmlDsigExcC14NTransform c14n = new XmlDsigExcC14NTransform();

reference.AddTransform(env);
reference.AddTransform(c14n);

ただし、上記の例の代わりに実際に実行したいことは、CanonicalizationMethodc14nに設定されていると思います。

signedXml.SignedInfo.CanonicalizationMethod = "http://www.w3.org/2001/10/xml-exc-c14n#";
 - or - 
signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;
于 2012-12-06T20:43:49.617 に答える