署名を検証する必要がある XML ドキュメントがあります。SignedInfo 要素には、アルゴリズム「http://www.w3.org/2001/10/xml-exc-c14n#」を指定する要素 CanonicalizationMethod があり、次のように PrefixList 属性が設定された子要素 InclusiveNamespaces もあります。
<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="soapenv"></ec:InclusiveNamespaces>
</ds:CanonicalizationMethod>...
次のコードを使用して、C14Transform オブジェクトを作成します。
XmlDsigExcC14NTransform cn14Transform = new XmlDsigExcC14NTransform(false, "soapenv");
属性"soapenv"
の由来はどこにありますか。PrefixList
上記の XML を (空白を無視して) 正規化すると、次のようになります ( xmlns:soapenv="..."
2 行目の部分に注意してください)。
<ds:SignedInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="soapenv"></ec:InclusiveNamespaces>
</ds:CanonicalizationMethod>
...
私が抱えている問題はxmlns:soapenv="..."
、正規化時にその部分が含まれず、署名の検証が失敗することです。
プログラムで挿入することでこれを回避できますが、PrefixList コンテンツにはさまざまなバリエーションがあるため、これは面倒です。