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のバグのように見えますが、それでも、どちらの標準形が正しいかを知っていれば、自分で修正できれば幸いです。 。その属性は、排他的な正規化によって省略されるべきですか?それとも含める必要がありますか?正しい排他的な標準形はどれですか?