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

CAS 單點登錄實戰(一):環境準備、OpenSSL 自簽證書生成與 Nginx HTTPS 配置

     編輯:Java 綜合教學

業務背景:為什麼選 CAS?

企業多系統集成需統一身份認證:用戶登錄一次,訪問所有受信應用無需再次登錄。CAS (Central Authentication Service) 耶魯大學開源,成熟穩定、协议标准(CAS 1.0/2.0/3.0、SAML、OAuth、OpenID Connect),Java 生態原生支持,是構建 SSO 平台的首選。

架構設計:CAS Server + 多 Client + Nginx 反向代理

  • CAS Server:認證中心,部署於 https://demo.testcas.com,強制 HTTPS 保護憑證傳輸。
  • Client 應用:https://app1.testcas.com、https://app2.testcas.com,接入 CAS Client Filter 驗證 Ticket。
  • Nginx:統一入口,終結 HTTPS,向後端轉發 HTTP,配置域名路由、SSL 證書、靜態資源緩存。

步驟一:本地域名映射(開發/測試環境)

編輯 C:\Windows\System32\drivers\etc\hosts(需管理員權限):

127.0.0.1 demo.testcas.com
127.0.0.1 app1.testcas.com
127.0.0.1 app2.testcas.com

步驟二:OpenSSL 生成自簽 CA 與域名證書

為什麼不用 JDK keytool? Nginx 不支持 JKS 格式,需 PEM 格式(.crt/.key)。

1. 安裝 OpenSSL(Windows 下載二進制包,Linux yum install openssl)

2. 生成 CA 根證書

# 1. 生成 CA 私鑰(2048 位,AES-256 加密,設置密碼)
openssl genrsa -des3 -out ca.key 2048

# 2. 生成 CA 根證書(有效期 20 年)
openssl req -new -x509 -days 7305 -key ca.key -out ca.crt
# Common Name 輸入:CAS Root CA

3. 生成服務端證書並由 CA 簽名

# 1. 生成服務端私鑰(1024 位,加密)
openssl genrsa -des3 -out demo.testcas.com.pem 1024

# 2. 解密私鑰(Nginx 啟動不想輸入密碼)
openssl rsa -in demo.testcas.com.pem -out demo.testcas.com.key

# 3. 生成證書簽名請求 CSR
openssl req -new -key demo.testcas.com.pem -out demo.testcas.com.csr
# Common Name **關鍵**:輸入完整域名 demo.testcas.com

# 4. CA 簽名頒發證書(有效期 4 年)
openssl ca -policy policy_anything -days 1460 -cert ca.crt -keyfile ca.key -in demo.testcas.com.csr -out demo.testcas.com.crt
# 提示確認簽名輸入 y

最終產物:demo.testcas.com.crt(公鑰證書)、demo.testcas.com.key(解密私鑰)、ca.crt(根證書,客戶端信任用)。

步驟三:Nginx HTTPS 配置與 HTTP 強制跳轉

# 全局上下文
events { worker_connections 1024; }
http {
    upstream cas_server { server 127.0.0.1:8781; }  # CAS Server Tomcat 端口
    upstream app1 { server 127.0.0.1:8380; }
    upstream app2 { server 127.0.0.1:8680; }

    # HTTP 80 端口:強制跳轉 HTTPS(僅 CAS Server 域名)
    server {
        listen 80;
        server_name demo.testcas.com;
        return 301 https://$host$request_uri;  # 永久重定向
    }

    # 應用域名保持 HTTP(內網無需 SSL,或按需配置)
    server { listen 80; server_name app1.testcas.com; location / { proxy_pass https://app1; } }
    server { listen 80; server_name app2.testcas.com; location / { proxy_pass https://app2; } }

    # HTTPS 443 端口:CAS Server SSL 終結
    server {
        listen 443 ssl;
        server_name demo.testcas.com;

        ssl_certificate     /path/to/demo.testcas.com.crt;
        ssl_certificate_key /path/to/demo.testcas.com.key;
        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 10m;
        ssl_protocols       TLSv1.2 TLSv1.3;
        ssl_ciphers         HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        location / {
            proxy_pass https://cas_server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto https;  # 關鍵:告知後端原協議為 HTTPS
        }
    }
}

步驟四:驗證與常見坑

  • 瀏覽器訪問 https://demo.testcas.com:自簽證書會提示「不安全」,點擊「繼續訪問」見到 CAS 登錄頁即成功。生產環境**必須**申請受信 CA 證書(Let's Encrypt 免費或商業 CA)。
  • openssl ca 報錯 failed to update database:創建 index.txt、serial 文件於 demoCA 目錄(openssl.cnf 指定路徑)。
  • Nginx 啟動報 SSL_CTX_use_PrivateKey_file failed:證書與私鑰不匹配,檢查 .crt 是否對應 .key(openssl x509 -noout -modulus -in cert.crt | openssl md5 對比)。
  • X-Forwarded-Proto:CAS Server 需讀取此頭判斷請求安全性,生成正確 Service URL,否則重定向回 HTTP 導致循環。

系列預告

  1. (二) CAS Server 部署(WAR 包/Overlay)、CAS Client 接入(Filter 配置、Ticket 驗證流程)。
  2. (三) 自定義 AuthenticationHandler 對接業務用戶表/ LDAP / OAuth2。
  3. (四) 登錄頁面加入驗證碼、防暴力破解。
  4. (五) 靜態資源放行、無需登錄路徑配置。
  5. (六) 單點登出(SLO):前端通道 / 後端通道登出傳播。
  6. (七) Session 超時策略:Server/Client 雙邊超時協調。
  7. (八) Maven Overlay 無侵入式定制 CAS(主題、頁面、邏輯)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved