XMLDSigを使用して署名されたXMLメッセージを検証しようとしています。メッセージダイジェストを作成するには、最初にメッセージを正規化する必要があります。DOMNode :: C14N()が以下のコードから2番目の名前空間を削除することを除いて、正常に動作します。
<?xml version="1.0" encoding="UTF-8"?><DirectoryRes xmlns="http://www.idealdesk.com/ideal/messages/mer-acq/3.3.1" xmlns:ns2="http://www.w3.org/2000/09/xmldsig#" version="3.3.1">
<createDateTimestamp>2012-10-29T17:04:56.374Z</createDateTimestamp>
<Acquirer>
<acquirerID>0050</acquirerID>
</Acquirer>
<Directory>
<directoryDateTimestamp>2012-10-29T17:04:56.374Z</directoryDateTimestamp>
<Country>
<countryNames>Deutschland</countryNames>
<Issuer>
<issuerID>NLINGB2U152</issuerID>
<issuerName>Issuer Simulator</issuerName>
</Issuer>
</Country>
</Directory>
</DirectoryRes>
上記のXMLを正規化すると、次のXMLになります。
<DirectoryRes xmlns="http://www.idealdesk.com/ideal/messages/mer-acq/3.3.1" version="3.3.1">
<createDateTimestamp>2012-10-29T17:04:56.374Z</createDateTimestamp>
<Acquirer>
<acquirerID>0050</acquirerID>
</Acquirer>
<Directory>
<directoryDateTimestamp>2012-10-29T17:04:56.374Z</directoryDateTimestamp>
<Country>
<countryNames>Deutschland</countryNames>
<Issuer>
<issuerID>NLINGB2U152</issuerID>
<issuerName>Issuer Simulator</issuerName>
</Issuer>
</Country>
</Directory>
</DirectoryRes>
私がテストしているリモートサーバーは、メッセージダイジェストを計算するときにこの名前空間を保持しているため、検証は明らかに失敗します。メッセージに埋め込まれたダイジェストと比較するために独自のダイジェストを作成する前に、最初に名前空間を追加してこの問題を確認しました(投稿前に上記のXMLコードから署名が削除されました)。ただし、コードはさまざまなサーバーで動作する必要があり、その一部は名前空間を追加する場合と追加しない場合があります(これらは仕様の一部ではありませんが、私が知る限り、冗長な名前空間宣言を追加するだけで問題はありません)。これをW3CXMLC14N仕様で調べましたそして彼らは、ルート要素は空のデフォルトの名前空間を除いて、常に名前空間を保持するべきだと言っています。消える名前空間はデフォルトでも空でもないので、これがDOMNode :: C14N()のバグなのか、それとも重要なものを見落としているのかわかりません。