2017-01-04 14 views
2

Я получаю запрос SAML связывание содержания запроса SAML выглядит как этоКак проверить подпись SAML для HTTP-редиректа связывания

{ «SigAlg» => «http://www.w3.org/2000/09/xmldsig#rsa-sha1» с помощью HTTP-редиректа , "SAMLRequest" => "lVLLaoQwFP0VyT5jEqPG4AiFoSDMtNApXXQzxDxaQRObRDqfX3XoolAKXd7DPQ/uuXUQ4zDxo3tzc3zSH7MOMWkPe3DpcixzVVVQl4RBqoiCncEYEmkoY7k00hCQvGgfemf3gOwQSNoQZt3aEIWNC4RwCRGGiD6jkmPMs2KHUPYKksPi0lsRN + Z7jFPgafqpvejtbtQpSK7jYAPfsu3B7C13IvSBWzHqwKPk57vTkS + WfPIuOukG0NSbub9R/yaJELRfzUGzrhmtFut15qdeeheciY926K2u05toUz8sIu0huXd + FPFv9RXpFTTbKp/WA4WobQT/jEYrykwhNaQ66yDNMwY7wijEtMCmysqqo6xOb8Ga + tbjWYe1jtYqfW0uCucoYwWCHS3F0kRGoajWTpAiiJRZJRmu01 + Y3 + CPt2i + АА =="}

Она также имеет значение подписи

WkDaGzC6vPTlzh + EnFA5/8IMmV7LviyRh2DA5EHF0K0nl + xzBlKfNCYRnunpwoEvGhereGdI5xBpv + mc9IguiCaLZSZjDh6lIDdpvctCnmSNzORqzWQwQGeZ9vjgtCLjUn35VZLNs3WgEqbi2cL + ObrUDS2gV1XvBA3Q3RRhoDmi + XE89Ztnd1cNpR3XdA + EL2ENbMI2XAD9qSgMufUJY/3GBBpT7Vg1ODtPxBudq + sXrgPh/+ WtUUitLkkfC8tdRTCS1EZPv + h27I5g/VNza23Xl8w2HdAuYP0F2FjREo8VV2aUtaOUd/jAF9 + bfkGV93y1PzFttLxdBbFoxp6qBg ==

Но я не понимаю, как проверить правильность этой подписи.

Раздел 3.4.4.1 на SAML связывания https://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf

To construct the signature, a string consisting of the concatenation of the RelayState (if present), 
SigAlg, and SAMLRequest (or SAMLResponse) query string parameters (each one URLencoded) 
is constructed in one of the following ways (ordered as below): 
SAMLRequest=value&RelayState=value&SigAlg=value 
SAMLResponse=value&RelayState=value&SigAlg=value 

Я попробовал подход, но

  • Подпись Я генерироваться с помощью закрытого ключа не совпадает с той, которую я получил от моего SP , (Размещен выше)

  • Кроме того, я не в состоянии расшифровать подписанное сообщение с помощью секретного ключа (я предполагаю, что подпись была создана с помощью общественности, что я федеративного это с.)

<samlp:LogoutRequest ID="_36167d94-d868-4c04-aee3-8bbd4ed91317" Version="2.0" IssueInstant="2017-01-05T16:21:55.704Z" Destination="https://werain.me/" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"><Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">urn:federation:MicrosoftOnline</Issuer><NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" xmlns="urn:oasis:names:tc:SAML:2.0:assertion">4948f6ce-4e3b-4538-b284-1461f9379b48</NameID><samlp:SessionIndex>_eafbb730-b590-0134-a918-00d202739c81</samlp:SessionIndex></samlp:LogoutRequest>

Любая помощь здесь.

ответ

3

SAML, сообщение об аутентификации является XML-документ с внедренным (оболочечным) XMLDSIG подписью или спущенное кодированием подпись

Окутанного XMLDSign подпись

<samlp:LogoutRequest> 
    <...saml message...> 
    <ds:Signature> 
     <ds:SignedInfo /> 
     <ds:SignatureValue /> 
     <ds:KeyInfo /> 
    </ds:Signature> 
</samlp:LogoutRequest> 

<ds:SignatureValue> содержит подпись, <ds:SignedInfo> подписанных данных и ссылка на сообщение и <ds:KeyInfo> обычно содержит сертификат X509 с личностью подписывающего лица или ссылку на этот сертификат

Дефлированного кодирования URL

SAMLRequest=value&RelayState=value&SigAlg=value&Signature=value 

Если каждое значение в кодировке URL

SAMLRequest=urlencode(base64(<samlp:LogoutRequest> <...saml message...> </samlp:LogoutRequest>)) 

И подпись делается на конкатенации алгоритма строки запроса с использованием алгоритма SigAlg

Signature = urlencode(base64 (SigAlg ("SAMLRequest=value&RelayState=value&SigAlg=value"))) 

Цифровая подпись SAML messag эс

SAML сообщение с цифровой подписью (не шифруются) с закрытым ключом эмитента (SP), и может быть проверена с помощью открытого ключа SP. Ответ SAML должен быть подписан с закрытым ключом поставщика идентификации (IdP), и SP может проверить сообщение с открытым ключом IdP.

Если вы будете действовать, как IdP и вы хотите, чтобы проверить запрос SAML в SP, вам нужно:

  • Проверка цифровой подписи: Verify с помощью открытого ключа SP, что матч подписи с подписанным сообщением, чтобы обеспечить идентичность подписывающего и сообщение не было изменено

  • Авторизуйте запрос: Убедитесь, что личность подписавшего может выполнить требуемую операцию. Обычно вы должны соответствовать серийному номеру или субъект сертификата с предсуществующем списком, или проверить, что сертификат был выдан доверенным центром сертификации

  • Сформировать ответ SAML: Сформировать сообщение XML с данными SAML и подписать его с закрытым ключом, чтобы отправить SP

Большинство языков программирования поддерживают подписи XMLDSig, но в вашем случае используется спущенном encodin г, что является специфической характеристикой связывания SAML, так если ваша библиотека SAML не поддерживает его, вы должны подтвердить подпись вручную. Это более или менее шаги, которые следует соблюдать в соответствии с specification

//get params from query string 
String samlrequest = getQueryParam("SAMLRequest"); 
String relaystate = getQueryParam("RelayState"); 
String sigalg = getQueryParam("SigAlg"); 
String signature = getQueryParam("Signature"); 


//The signature 
byte signature[] = URLDecoder.decode(Base64.getDecoder().decode(signature), "UTF-8"); 

//The signed data. build the following string checking if RelayState is null 
//SAMLRequest=samlrequest&RelayState=relaystate&SigAlg=sigalg 
byte signedData[] = concat(samlrequest,relaystate,sigalg); 

//The signature algorithm could be "SHA1WithRSA" or "SHA1withDSA" depending on sigalg is http://www.w3.org/2000/09/xmldsig#rsa-sha1 or http://www.w3.org/2000/09/xmldsig#dsa-sha1 
String signatureAlgorithm = extractSignatureAlgorithm(sigalg); 

//get the public key of the SP. It must be registered before this process 
PublicKey publicKey = ... 

//Verify the signature 
Signature sig = Signature.getInstance(signatureAlgorithm); 
sig.initVerify(publicKey); 
sig.update(signedData); 
boolean verifies = sig.verify(signature); 
+0

пара вещей. Во-первых, это 'LogoutRequest', а не SAML' AuthRequest' (я думаю, я забыл упомянуть об этом). Вторая. Связывание - это перенаправление HTTP, а не HTTP-POST, см. РАЗДЕЛ 3.4.4.1 привязок SAML. – Ratatouille

+0

Также исправьте меня, если я ошибаюсь, но это так, как подпись и проверка SAML работают правильно. IDP (имеет собственную партию public/private) SP (имеет собственную партию public/private). Если IDP должен подписать данные, которые он подписывает, используя собственный личный ключ. SP может затем расшифровать данные знака с помощью Public/cert IDP (совместно используемого через метаданные IDP). Как и мудрый, если SP должен подписывать данные, которые он делает, используя собственный личный ключ, тогда IDP расшифровывает его, используя Public/Cert SP (доступный через метаданные SP) – Ratatouille

+0

'AuthRequest' просто был примером. Модель подписи для IdP & SP верна. Только термин 'decrypt' не подходит. Сообщение подписано, а не зашифровано (содержимое не скрыто), а операция проверки с открытым ключом - 'проверка' – pedrofb

 Смежные вопросы

  • Нет связанных вопросов^_^