2016-08-26 60 views
1

鑑於以下SAML響應,我如何手動驗證簽名是有效的?我認爲我應該依靠元數據中提供的IDP證書,而不是響應本身的證書(儘管它們應該是相同的)。如何手動驗證SAMLResponse簽名?

有沒有辦法用openssl或xmlsec1命令做到這一點?

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="s2a79da8e2cd2eda272fd5d2d474858f1919430a96" Version="2.0" IssueInstant="2016-08-25T00:24:45Z" Destination="http://10.88.111.163:8080/zport/dmd"> 
    <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://idp.ssocircle.com</saml:Issuer> 
    <samlp:Status xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"> 
<samlp:StatusCode xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" Value="urn:oasis:names:tc:SAML:2.0:status:Success"> 
</samlp:StatusCode> 
</samlp:Status> 
    <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="s22b55a88e8022a4d198715d5b3f21c3fbd699dac4" IssueInstant="2016-08-25T00:24:45Z" Version="2.0"> 
<saml:Issuer>https://idp.ssocircle.com</saml:Issuer><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> 
<ds:SignedInfo> 
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> 
<ds:Reference URI="#s22b55a88e8022a4d198715d5b3f21c3fbd699dac4"> 
<ds:Transforms> 
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> 
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/> 
</ds:Transforms> 
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
<ds:DigestValue>abEMP7cxDW8LwnvcUzr2dHmQesk=</ds:DigestValue> 
</ds:Reference> 
</ds:SignedInfo> 
<ds:SignatureValue> 
#SIGNATURE# 
</ds:SignatureValue> 
<ds:KeyInfo> 
<ds:X509Data> 
<ds:X509Certificate> 
#CERTIFICATE# 
</ds:X509Certificate> 
</ds:X509Data> 
</ds:KeyInfo> 
</ds:Signature><saml:Subject> 
<saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified" NameQualifier="https://idp.ssocircle.com" SPNameQualifier="instance">ben</saml:NameID><saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"> 
<saml:SubjectConfirmationData NotOnOrAfter="2016-08-25T00:34:45Z" Recipient="http://10.88.111.163:8080/zport/dmd"/></saml:SubjectConfirmation> 
</saml:Subject><saml:Conditions NotBefore="2016-08-25T00:14:45Z" NotOnOrAfter="2016-08-25T00:34:45Z"> 
<saml:AudienceRestriction> 
<saml:Audience>instance</saml:Audience> 
</saml:AudienceRestriction> 
</saml:Conditions> 
<saml:AuthnStatement AuthnInstant="2016-08-25T00:16:14Z" SessionIndex="s2e2b6d389c12dd386a118286d1228e159faee1901"><saml:AuthnContext><saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef></saml:AuthnContext></saml:AuthnStatement><saml:AttributeStatement><saml:Attribute Name="EmailAddress"><saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">[email protected]</saml:AttributeValue></saml:Attribute><saml:Attribute Name="FirstName"><saml:AttributeValue xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Ben</saml:AttributeValue></saml:Attribute></saml:AttributeStatement></saml:Assertion> 
</samlp:Response> 
+0

的上市你所提供的將永遠不會被驗證,因爲您已經錯誤地解碼了響應。規範化是不正確的。 –

回答

3

假設驗證證書是在一個名爲cert.pem和(未修改,逐字)SAML響應文件中response.xmlxmlsec1可用於驗證響應簽名如下:

xmlsec1 verify --id-attr:ID "urn:oasis:names:tc:SAML:2.0:protocol:Response" --pubkey-cert-pem cert.pem response.xml 
+0

謝謝,但我得到了一個錯誤: libxml2庫函數失敗:EXPR =的XPointer(ID(「s2f27544a6d89dd3d9dae51892cb91e5473966a9c4」)) – Ben

+0

你需要尋找到完整的「堆棧跟蹤」 –

+1

我需要使用「甕:綠洲:名稱:tc:SAML:2.0:assertion:Assertion「爲ID節點。 「urn:oasis:名稱:tc:SAML:2.0:protocol:Response」標識了錯誤的ID。 – Ben