1

xmlseclibsを使用してSOAPドキュメントに署名しようとしていますが、署名するか検証するかによって、同じように正規化されていないようです。

例を挙げましょう。これは私が署名しようとしているXMLです:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" MajorVersion="1" MinorVersion="1" IssueInstant="2010-02-04T15:27:43Z" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester"/>
</samlp:Status>
</samlp:Response>
</soapenv:Body>
</soapenv:Envelope>

公開鍵と秘密鍵の証明書の組み合わせを使用して署名するためにPHPで動作するコードを取得しましたが、動作しているように見えました。それはすべての適切なもので要素を追加しました<ds:Signature>、そしてそれは素晴らしく見えました。しかし、署名後すぐにxmlseclibs(および公開鍵証明書)を使用して検証を試みてテストしましたが、検証に失敗しました。したがって、まったく同じコードライブラリが署名と検証の両方を実行しますが、2つのプロセスは何らかの理由で一致しません。

xmlseclibsにデバッグコードを追加して、それが何をしているのかを調べました。署名キーと検証キーが異なる理由は、2つの状況で正規化が異なるためであることに気付きました。要素に署名するように指示すると<samlp:Response>、これは署名する標準形になります(読みやすくするためにここに改行を追加しました)。

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester">
</samlp:StatusCode>
</samlp:Status>
</samlp:Response>

ただし、署名を検証する場合、これは検証のために計算する標準形です(ここでも、改行を追加しました)。

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester">
</samlp:StatusCode>
</samlp:Status>
</samlp:Response>

ご覧のとおり、このバージョンxmlns:samlでは要素から属性が省略されていますが<samlp:Response>、最初のバージョンでは省略されていません。(これは、両方に含まれている属性とは異なることに注意してくださいxmlns:samlp。)これはxmlseclibsのバグのように見えますが、それでも、どちらの標準形が正しいかを知っていれば、自分で修正できれば幸いです。 。その属性は、排他的な正規化によって省略されるべきですか?それとも含める必要がありますか?正しい排他的な標準形はどれですか?

4

2 に答える 2

3

どちらも正しい標準形ではありません!

署名XMLには、非名前空間属性の後に続く名前空間宣言があります。これは、ドキュメントの順序規則に違反します。

名前空間ノードは、属性ノードよりもドキュメントの順序の位置が低くなります。

検証XMLにsaml名前空間ノードが完全にありません。Canonicalisationは、名前空間ノードを参照する子コンテンツがないという理由だけで名前空間ノードを削除しません。冗長な名前空間ノード(つまり、親ですでに有効になっている名前空間)のみを削除します。

xmlseclibsについて、なぜこれが起こっているのかを説明するのに十分なことはわかりませんが、両方の点で間違いなく間違っています。ここで私のDOMのc14n関数は次のように言っています。

<samlp:Response xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester"></samlp:StatusCode>
</samlp:Status>
</samlp:Response>

eta:xmlseclibs.phpSVNで調べたところですが、現在のアプローチには根本的な欠陥があるため、これを簡単に修正することはできません。「正規化された」DOMを作成しようとし、それをプレーンな古いものでシリアル化しsaveXML()ます。属性の順序と文字のエスケープに関するC14Nシリアル化ルールがありsaveXML、従うことを約束していないため、これが機能する可能性はありません。

于 2010-02-04T16:28:07.140 に答える
2

DOMドキュメントを不適切に作成し、無効なメモリ内ツリーを使用しようとしています。シリアル化してシリアル化された結果を使用するか、署名を試みる前にツリーに名前空間宣言を適切に作成してください。詳細については、バグレポートを参照してください:http ://code.google.com/p/xmlseclibs/issues/detail?id = 6

于 2010-02-04T18:55:50.410 に答える