Подписать ответ SAML с подтверждением или без подтверждения?

При подписании ответа SAML, который также имеет подписанное утверждение, я должен:

А) Создайте подпись Ответа без подписи Утверждения. Затем введите подпись подтверждения после того, как обе подписи были сгенерированы.

B) Сгенерируйте подпись Утверждения и включите ее при генерации подписи Ответа.

В) что-то еще?

Ответ 1

SAML ужасен, каждый раз, когда я читаю ответ, они почти правильные, вот правильный алгоритм:

  1. SHA1 каноническая версия Утверждения.
  2. Создать XML-фрагмент SignedInfo с подписью SHA1
  3. Подпишите фрагмент XML SignedInfo, снова каноническую форму
  4. Возьмите SignedInfo, подпись и ключевую информацию и создайте фрагмент подписи XML
  5. Вставьте этот SignatureXML в утверждение (должно идти прямо перед saml: subject)
  6. Теперь возьмите утверждение (с включенной подписью) и вставьте его в ответ
  7. SHA1 этот ответ
  8. Создать XML-фрагмент SignedInfo с подписью SHA1
  9. Подпишите фрагмент XML SignedInfo, снова каноническую форму
  10. Возьмите SignedInfo, подпись и ключевую информацию и создайте фрагмент подписи XML
  11. Вставьте эту подписьXML в ответ
  12. Добавьте информацию о версии XML в ответ.

Это оно. SAML совершенно ужасно. Существует множество мелких тонкостей, которые делают реализацию SAML кошмаром (например, вычисление канонической формы подмножества XML (утверждение), также не включена XML-версия XML-документов.

Я закончил свою реализацию, я надеюсь, что больше никогда не вернусь к такой боли.

Ответ 2

Я считаю, что правильный ответ - Б). Сначала подпишите подтверждение, затем подпишите ответ, содержащий подписанные данные подтверждения. Однако, если один Эмитент/Сущность (STS/IDP/и т.д.) Подписывает оба документа, нет ли реальной причины подписывать Утверждение? Просто подпишите протокольное сообщение/ответ, который должен включать данные подтверждения. Это сократит требования к обработке в SP. Что касается единого входа в Интернет, то я видел только две части, подписанные, когда у вас есть другая сущность, подписывающая Утверждение против Ответа.

Ответ 3

Если вы подписываете оба, то сначала должно быть подписано утверждение, а затем ответ, потому что подпись ответа будет основываться на всем содержимом ответа (включая подпись подтверждения). Таким образом, подписание второго утверждения приведет к аннулированию сигнатуры ответа.

Ответ 4

Правильный ответ - B.

Если заявляющая сторона подписывает ответ SAML с использованием A, то полагающаяся сторона должна удалить подпись ответа SAML и подпись утверждения SAML до проверки ответа SAML. Спецификация ядра SAML говорит, что подпись не должна генерироваться с использованием преобразований, отличных от конвертированного сигнатурного преобразования или эксклюзивного преобразования канонизации. Ни одно из этих двух преобразований не может удалить подпись утверждения SAML. Таким образом, полагающаяся сторона не может подтвердить ответ SAML.