首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

CAS 4.x 整合 SPNEGO/Kerberos 實現桌面單點登錄完整部署指南

     編輯:Java 綜合教學

CAS 4.x 整合 SPNEGO/Kerberos 實現桌面單點登錄完整部署指南

基於 CAS 4.1.8 實現 SPNEGO 認證,讓域內用戶訪問 Web 應用時無感知自動登錄(Kerberos/NTLM)。涉及 AD 域、DNS、SPN、Keytab、瀏覽器、Java 加密策略、CAS Webflow 等多環節,易踩坑,特記錄全流程。

環境拓撲

  • Windows Server 2012 R2:DNS + AD Domain Controller(域 example.com)。
  • Client (Win7):加域用戶 client,IE/Firefox 配置信任站點。
  • Web App Server (Win7/Linux):部署 CAS,運行用戶 server,IP 172.10.1.10,主機名 server.example.com。

關鍵步驟速覽

  1. AD 域準備:建域 example.com,創建用戶 client/server,設置「密碼永不過期」,賬戶選項僅勾選「支持 Kerberos AES 256 位加密」。
  2. 客戶端/應用服務器加域:加入 example.com,重啟驗證 whoami 顯示域用戶。
  3. 註冊 SPN(在 DC 執行):
    setspn -s HTTP/server.example.com@EXAMPLE.COM server
    setspn -l server  # 驗證
  4. 導出 Keytab(在 DC 執行):
    ktpass /princ HTTP/server.example.com@EXAMPLE.COM /mapuser server /pass ****** /out server.keytab /crypto all /ptype KRB5_NT_PRINCIPAL /mapop set
    將 server.keytab 複製到 CAS 服務器(如 C:/keytab/server.keytab)。
  5. 瀏覽器配置:
    • IE:Internet 選項 → 高級 → 勾選「啟用集成 Windows 驗證」;安全 → 本地 Intranet → 站點 → 高級 → 添加 https://server.example.com。
    • Firefox:about:config 設置 network.negotiate-auth.trusted-uris = https://server.example.com。
  6. Java 無限制加密策略:下載對應 JDK 版本 JCE 檔(local_policy.jar/US_export_policy.jar)替換 $JAVA_HOME/jre/lib/security/ 下文件,支持 AES-256。
  7. CAS Webflow 接入 SPNEGO(login-webflow.xml):
    <action-state id="startAuthenticate">
      <evaluate expression="negociateSpnego" />
      <transition on="success" to="spnego" />
    </action-state>
    <action-state id="spnego">
      <evaluate expression="spnego" />
      <transition on="success" to="sendTicketGrantingTicket" />
      <transition on="error" to="viewLoginForm" />
    </action-state>
    <!-- 修改 generateLoginTicket 後的 transition 目標為 startAuthenticate -->
  8. CAS Spring Bean 定義(cas-servlet.xml):
    <bean id="negociateSpnego" class="org.jasig.cas.support.spnego.web.flow.SpnegoNegociateCredentialsAction" />
    <bean id="spnego" class="org.jasig.cas.support.spnego.web.flow.SpnegoCredentialsAction"
          p:centralAuthenticationService-ref="centralAuthenticationService" />
  9. 認證處理器鏈配置(deployerConfigContext.xml):
    <bean id="jcifsConfig" class="org.jasig.cas.support.spnego.authentication.handler.support.JCIFSConfig"
          p:jcifsServicePrincipal="HTTP/server.example.com@EXAMPLE.COM"
          p:kerberosDebug="false"
          p:kerberosRealm="EXAMPLE.COM"
          p:kerberosKdc="172.10.1.10"
          p:loginConf="/login.conf" />
    
    <bean id="spnegoAuthentication" class="jcifs.spnego.Authentication" />
    <bean id="spnegoHandler" class="org.jasig.cas.support.spnego.authentication.handler.support.JCIFSSpnegoAuthenticationHandler"
          p:authentication-ref="spnegoAuthentication"
          p:principalWithDomainName="false"
          p:NTLMallowed="true" />
    
    <bean id="spnegoPrincipalResolver" class="org.jasig.cas.support.spnego.authentication.principal.SpnegoPrincipalResolver" />
    
    <bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
      <constructor-arg>
        <map><entry key-ref="spnegoHandler" value-ref="spnegoPrincipalResolver"/></map>
      </constructor-arg>
    </bean>
  10. JAAS 登錄配置(login.conf 放類路徑):
    jcifs.spnego.initiate {
      com.sun.security.auth.module.Krb5LoginModule required
        storeKey=true useKeyTab=true keyTab="C:/keytab/server.keytab";
    };
    jcifs.spnego.accept {
      com.sun.security.auth.module.Krb5LoginModule required
        storeKey=true useKeyTab=true keyTab="C:/keytab/server.keytab";
    };
  11. Client hosts 文件:172.10.1.10 server.example.com。

常見坑點排查

  • Keytab 加密類型不匹配:ktpass /crypto all 導出所有加密類型,JCE 無限制策略必須生效。
  • SPN 重複/大小寫:Realm 必須大寫,SPN 格式 HTTP/host@REALM。
  • 時間同步:Kerberos 要求時間偏差 < 5 分鐘,域內機器必須同步 NTP。
  • NTLM 回退:p:NTLMallowed="true" 允許不支持 Kerberos 的客戶端降級 NTLM。
  • CAS 版本差異:4.2+ 包名變更為 org.apereo.cas,Bean 類名可能調整,參考官方文檔。
官方參考:CAS SPNEGO Authentication
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved