2011-12-05 93 views
2

我需要驗證這種SAML斷言:如何在Perl中驗證SAML斷言?

<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ID="Assertion-uuide824d44-0134-14b1-8e70-f85c710cb043" IssueInstant="2011-12-05T13:55:47Z" Version="2.0"> 
    <saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">MPS</saml:Issuer> 
     <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="uuide824d48-0134-18fe-b37b-f85c710cb043"> 
     <ds:SignedInfo> 
      <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></ds:CanonicalizationMethod> 
      <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"></ds:SignatureMethod> 
      <ds:Reference URI="#Assertion-uuide824d44-0134-14b1-8e70-f85c710cb043"> 
       <ds:Transforms> 
        <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform> 
        <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> 
         <xc14n:InclusiveNamespaces xmlns:xc14n="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="xs saml xsi"></xc14n:InclusiveNamespaces> 
        </ds:Transform> 
       </ds:Transforms> 
       <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"></ds:DigestMethod> 
       <ds:DigestValue>p02xKMDUYCR5xpppYUOQgsGBR5c=</ds:DigestValue> 
      </ds:Reference> 
     </ds:SignedInfo> 
     <ds:SignatureValue>R9YHo8TK/wYkGkTP3QrnnM8U6TKf9vu+ElpRjDPgpg4O88oARZSb9OhlVn2sXJGEaQ5i0ORrofbKwOI+D/jFgz3Hz/g/h4yt2aqIFxLpOTFb448bDvFsHHWAoWc0DUPYf1AjW7Peu1ICSCdR3EaVLqtgdsUsVWoA7oXbWyAyVLM=</ds:SignatureValue> 
     <ds:KeyInfo> 
      <ds:KeyValue> 
       <ds:RSAKeyValue> 
        <ds:Modulus>iZ0D1X6rk8+ZwNBTVZt7C85m421a8A52Ksjw40t+jNvbLYDp/W66AMMYD7rB5qgniZ5K1p9W8ivM9WbPxc2u/60tFPg0e/Q/r/fxegW1K1umnay+5MaUvN3p4XUCRrfg79OvurvXQ7GZa1/wOp5vBIdXzg6i9CVAqL29JGi6GYU=</ds:Modulus> 
        <ds:Exponent>AQAB</ds:Exponent> 
       </ds:RSAKeyValue> 
      </ds:KeyValue> 
     </ds:KeyInfo> 
    </ds:Signature> 
    <saml:Subject> 
     <saml:NameID Format="urn:ibm:names:ITFIM:5.1:accessmanager">J006068</saml:NameID> 
     <saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"></saml:SubjectConfirmation> 
    </saml:Subject> 
    <saml:Conditions NotBefore="2011-12-05T13:45:47Z" NotOnOrAfter="2011-12-05T14:05:47Z"> 
     <saml:AudienceRestriction> 
      <saml:AttributeValue xsi:type="xs:string">1030</saml> 

我沒有找到CPAN庫,可以把SAML作爲參數,可以驗證它。

有人可以幫助我如何實現我的目標?

回答

3

好吧,總比不...如何使用它......

當你說「驗證爲晚'我不確定你的意思是'檢查斷言',或'驗證簽名'。

my $assertion = Net::SAML2::Protocol::Assertion->new_from_xml( 
    xml => decode_base64($saml_response) 
); 

然後您只需檢查通過訪問器創建的Assertion對象的有效性。我假設你理解SAML語義。

若要驗證簽名,你需要訪問私鑰:

my $sig = Net::SAML2::XML::Sig->new({ key =>'/private.key' }); 
$sig->verify($xml); 

查看XML ::西格的perldoc對變化的關鍵(X509,證書)的來源。

請注意,Net :: SAML2不包括加密的SAML斷言(),但您沒有詢問這一點。