2016-11-03 57 views
1

你好,我有這樣的XML從我的IDP一個SAML2響應:OpenSAML如何檢查SAML Response(簽名/證書)是否真的來自我的IDP?

<Assertion ID="_97031c65-0139-4047-a416-9495df5d6ed7" 
    IssueInstant="2016-10-26T07:45:43.438Z" Version="2.0" 
    xmlns="urn:oasis:names:tc:SAML:2.0:assertion"> 
    <Issuer> 
    </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/2001/04/xmldsig-more#rsa-sha256" /> 
      <ds:Reference URI="#_97031c65-0139-4047-a416-9495df5d6ed7"> 
       <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/2001/04/xmlenc#sha256" /> 
       <ds:DigestValue> 
        KMaF... 
       </ds:DigestValue> 
      </ds:Reference> 
     </ds:SignedInfo> 
     <ds:SignatureValue> 
      FHdZ.... 
     </ds:SignatureValue> 
     <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
      <X509Data> 
       <X509Certificate> 
        MII.... 
       </X509Certificate> 
      </X509Data> 
     </KeyInfo> 
    </ds:Signature> 
    .... 

現在我要檢查如果響應是從我的IDP有效響應。如何才能做到這一點? (我正在使用OpenSAML 3.x java) 僅僅對簽名和證書進行字符串比較就足夠了嗎?

我也有一個MetadataDocument.XML和來自我的IDP(Azure)的憑證信息。

相關:
SAML 2.0 - How to verify the sender certificate?

OpenSAML (2.0) Signature validation not working

回答

2

首先第一件事情:

不要推出自己的SAML實現。有太多事情可能會出錯,不值得冒險。我不知道我是否可以強調這一點。使用一個開源的,衆所周知的,測試的實施像Shibboleth SPsimplesamlphp

上面的警告放在一邊,並假設你是你自己的理解,這樣做,而不是作爲一個產品/服務,將提供給任何人,但你的一部分:

檢查響應來自您的IDP的方法是檢查數字簽名。爲此,您必須使用IDP的公開密鑰(包含在您從IDPs元數據中瞭解的IDP證書中)以驗證數字簽名。請閱讀Digital Signatures,Digital Signature verification瞭解需要完成的工作以及原因。然後,您可以通過閱讀Official Documetnation繼續進行操作。一些注意事項:

  • 不信任 SAML聲明附帶的證書。這裏只是針對您知道給定依賴方的多個證書的情況,您需要選擇適用於特定SAML對話的證書。
  • 您無法對簽名進行字符串比較。您無法使用計算相同的簽名,因爲您沒有IdP用來創建它的私鑰。
+0

嗨,我爲此使用OpenSAML。我已經獲得了登錄功能,但由於某些情況和安全原因,我們需要驗證從IDP的登錄中獲取的SAML響應,不僅在我們的用戶代理中,而且在資源請求時也在我們的資源服務器上。 – Gobliins

+0

真正的SAML登錄由流星賬戶執行。我們的想法是將響應和請求一起發送到我們的資源服務器,並執行手動OpenSAML驗證,以檢查請求是否來自可信來源(我們的用戶代理)。 – Gobliins

+0

我不知道我跟着你。我不熟悉流星帳戶是什麼。要說登錄功能沒有檢查簽名,就像說用戶名/密碼登錄工作,但你不檢查密碼是否正確。你將不得不編輯原始問題,以包括你的設置和你想做什麼,否則它很難幫你 –