Какая правильная XML исключительная канонизация?

я использую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 (и сертификата открытого ключа), но проверка не удалась. Таким образом, одна и та же библиотека кода выполняет подписывание и проверку, но по каким-то причинам эти два процесса не согласуются.

Я добавил некоторый код отладки в xmlseclibs, чтобы выяснить, что он делает, и понял, что причина, по которой он подписывает ключ подписи и ключ валидации, разные, потому что он канонизирует вещи по-разному в двух ситуациях. Когда я говорю это, чтобы подписать<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, но, тем не менее, я бы с удовольствием ее исправил, если бы просто знал, какая каноническая форма была правильной. Должен ли этот атрибут быть исключен из-за исключительной канонизации? Или это должно быть включено? Какая из них является правильной эксклюзивной канонической формой?

Ответы на вопрос(2)

Ваш ответ на вопрос