#encryption #saml-2.0 #adfs2.0 #openam #federation
#шифрование #saml-2.0 #adfs2.0 #openam #объединение
Вопрос:
У меня проблема с расшифровкой полученного сообщения SAML ответа аутентификации. Мое приложение связано с двумя IDP разных типов. Первый — это ForgeRocks, OpenAM и второй сервер ADFS от Microsoft. Обоим IDP был предоставлен один и тот же документ метаданных поставщика услуг, который содержит одинаковые открытые ключи сертификата для шифрования и подписи.
Случай 01 IdP: OpenAM, результат ForgeRock: процесс правильного дешифрования и ответа.
Случай 02 IdP : ADFS 2.0, Microsoft Результат : ошибка расшифровки с ошибкой: CryptographicException, неверные данные.
Возможно ли, что шифрование на стороне IdP отличается для одной и той же пары асимметричных ключей? Или я что-то не так понимаю?
Как я вижу, существуют различия в XML-узле EncryptedAssertion. Алгоритмы метода шифрования различны.
Вот ключевые узлы.
OpenAM, ForgeRock
<saml:EncryptedAssertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
<xenc:EncryptedData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
Type="http://www.w3.org/2001/04/xmlenc#Element"
>
<xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes128-cbc"
xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
/>
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<xenc:EncryptedKey xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5"
xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
/>
<xenc:CipherData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<xenc:CipherValue xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedKey>
</ds:KeyInfo>
<xenc:CipherData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<xenc:CipherValue xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
ADFS 2.0, Microsoft
<EncryptedAssertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion">
<xenc:EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
>
<xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<e:EncryptedKey xmlns:e="http://www.w3.org/2001/04/xmlenc#">
<e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p">
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
</e:EncryptionMethod>
<KeyInfo>
<ds:X509Data xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:X509IssuerSerial>
<ds:X509IssuerName>CN=certName</ds:X509IssuerName>
<ds:X509SerialNumber>-18xxxxxx</ds:X509SerialNumber>
</ds:X509IssuerSerial>
</ds:X509Data>
</KeyInfo>
<e:CipherData>
<e:CipherValue></e:CipherValue>
</e:CipherData>
</e:EncryptedKey>
</KeyInfo>
<xenc:CipherData>
<xenc:CipherValue></xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
Как я вижу, существуют различия в используемых методах шифрования. Также во втором случае есть имя псевдонима сертификата и серийный номер. Также серийный номер имеет отрицательное значение (возможно, потому, что я использую самозаверяющий сертификат).
Спасибо,
Комментарии:
1. Обычно ключ сертификата не описывает алгоритм; это часть протокола. Я почти уверен, что отрицательное значение для серийного номера сертификата указывает на ошибку в программном обеспечении для генерации сертификатов (забыв заполнить ЦЕЛОЕ число ASN.1, которое подписано
00
байтом). Обратите внимание, что я не эксперт по SAML.2. Я преобразовал отрицательное десятичное значение из сообщения и получил соответствующий серийный номер в шестнадцатеричном значении, поэтому я думаю, что это не проблема.
3. Нет, я не думаю, что это напрямую связано с проблемой, но, вероятно, это ошибка в любом случае. Я не знаю, как вы расшифровываете, однако MS использует AES 256 (что может привести к проблемам на платформах Java без неограниченного шифрования) и OAEP, который является более новым и безопасным методом шифрования.
4. Неясно, что такое ваше программное обеспечение SP. Поскольку SP выполняет дешифрование, я полагаю, вам следует сначала проверить, правильно ли он реализует дешифрование. Кроме того, если SP является приложением Java, вам следует убедиться, что на вашей виртуальной машине установлена «Файлы политики неограниченной юрисдикции Java Cryptography Extension (JCE) для JDK / JRE».
Ответ №1:
У вас есть это исключение, так как в соответствующих XML-узлах нет данных для расшифровки, вот в чем причина:
<e:CipherData>
<e:CipherValue>No data!!!</e:CipherValue>
</e:CipherData>
</e:EncryptedKey>
</KeyInfo>
<xenc:CipherData>
<xenc:CipherValue>No data!!!</xenc:CipherValue>
</xenc:CipherData>
Пример, как это должно быть:
<EncryptedAssertion xmlns="urn:oasis:names:tc:SAML:2.0:assertion">
<xenc:EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
>
<xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<e:EncryptedKey xmlns:e="http://www.w3.org/2001/04/xmlenc#">
<e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p">
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
</e:EncryptionMethod>
<KeyInfo>
<ds:X509Data xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:X509IssuerSerial>
<ds:X509IssuerName>CN=name, O=Name, S=CA, C=us</ds:X509IssuerName>
<ds:X509SerialNumber>0</ds:X509SerialNumber>
</ds:X509IssuerSerial>
</ds:X509Data>
</KeyInfo>
<e:CipherData>
<e:CipherValue>qSMgmgpO0 1vhdt5wvyhNT uh3BhmOlFD4IiWTPoj2N90nOUzwEoEkWCuGzHDizxq6rvc5eoikjgcbz5TYFlIX eizyxcJQFl02t... SOME VALUES HERE=</e:CipherValue>
</e:CipherData>
</e:EncryptedKey>
</KeyInfo>
<xenc:CipherData>
<xenc:CipherValue>RSCxYAMJ7RaD MtEcnmE9EwLmvDJgTsXx5MOKJYUJiAmQWziSLNolZQYt5xgUPHJaD co/PoWwifWuobHdClFwBBMR/lAqWAHIQldP ro ... SOME VALUES HERE=</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
</EncryptedAssertion>