知識點:
SSO:單點登錄(Single Sign On),是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。
CAS:耶魯大學開發的單點登錄(Single Sign On)系統稱為CAS(Central Authentication Server),他是一個開源的、相對比較簡單易用的SSO解決方案。
SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網絡通信提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層對網絡連接進行加密。
背景:
目前公司有相互關聯的幾個獨立項目,需要使用單點登錄進行整合,實現一站登錄,全站皆可以訪問。選用CAS開源項目。
現狀:
因為之前沒有做過,所以只能邊查、邊學、邊做。有一些網絡上查不到的需求,只能分析CAS源碼,采取折中處理方式來實現,如果大家發現有不合理處理方式,請隨時批評指正。
另外,寫這篇博文的時候,單點登錄功能基本已經實現完畢了,這里回顧記錄一下學習過程。
------------------------------------------分割----------------------------------------------
1.開發環境准備
證書生成工具:OpenSSL
服務器:Ngnix + tomcat
SSO框架:CAS
1.1 首先創建本地域名
demo.testcas.com 用來綁定CAS-Server
app1.testcas.com、app1.testcas.com 綁定兩個測試demo,用來驗證免登陸處理。
創建方法:
進入: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
1.2 生成安全證書
Cas server默認的安全認證是基於https協議的,這就要求在應用程序和CAS Server端配置SSL協議。
一般網絡上生成自用的不受瀏覽器信任的證書都是直接通過JDK自帶的應用keytool來制作的,但是因為我們用了Ngnix作為代理服務器,
而Ngnix不兼容keytool生成的證書來部署HTTPS網站,所以需要使用OpenSSL來生成證書。
1. 安裝OpenSSL
2. 進入OpenSSL安裝目錄,我的安裝路徑:D:\developesoft\openssl\openssl
同時,在bin目錄下建立幾個文件和文件夾,
有./demoCA/ ./demoCA/newcerts/ ./demoCA/index.txt ./demoCA/serial,在serial文件中寫入第一個序列號“01”
3. 命令模式 進入 bin 目錄
D:\developesoft\openssl\openssl\bin

4.生成CA私鑰:
輸入:openssl genrsa -des3 -out ca.key 2048

如果報紅線標注的Warning,那么把安裝目錄下的ssl/openssl.cnf 拷貝到 指定目錄c:/openssl/ssl/openssl.cnf下,重新執行命令

5.ca.crt CA根證書(公鑰):
openssl req -new -x509 -days 7305 -key ca.key -out ca.crt

6.制作生成網站的證書並用CA簽名認證
我的測試網站域名為demo.testcas.com
生成demo.testcas.com證書私鑰:
openssl genrsa -des3 -out demo.testcas.com.pem 1024
制作解密后的demo.testcas.com證書私鑰:
openssl rsa -in demo.testcas.com.pem -out demo.testcas.com.key
生成簽名請求:
openssl req -new -key demo.testcas.com.pem -out demo.testcas.com.csr

Common Name處輸入網址域名,其他隨便填寫都行
用CA進行簽名:
openssl ca -policy policy_anything -days 1460 -cert ca.crt -keyfile ca.key -in demo.testcas.com.csr -out demo.testcas.com.crt
在OpenSSL安裝目錄的bin目錄下,可以看到生成的證書與私鑰
demo.testcas.com.crt
demo.testcas.com.key
1.3 為nginx配置https
1.下載並安裝nginx,雙擊nginx.exe,在瀏覽器地址欄輸入:127.0.0.1,確認是否安裝成功。
2.打開conf/nginx.conf
找到# HTTPS server,做如下配置:
# HTTPS server
#
server {
listen 443 ssl;
server_name demo.testcas.com;
ssl_certificate demo.testcas.com.crt;
ssl_certificate_key demo.test.cas.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
#root html;
#index index.html index.htm;
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_pass http://demo;
}
}
紅字部分為剛才生成證書的路徑,可以直接把這證書copy到nginx安裝目錄下。
另外,當用戶輸入http請求時,直接跳轉到https請求
server {
listen 80;
server_name demo.testcas.com;
rewrite ^(.*)$ https://$host$1 permanent;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://demo;
}
}
配置全文如下:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream demo {
server 127.0.0.1:8781;
}
upstream app1 {
server 127.0.0.1:8380;
}
upstream app2 {
server 127.0.0.1:8680;
}
upstream myapp {
server 127.0.0.1:8084;
}
server {
listen 80;
server_name demo.testcas.com;
rewrite ^(.*)$ https://$host$1 permanent;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://demo;
}
}
server {
listen 80;
server_name app1.testcas.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://app1;
}
}
server {
listen 80;
server_name app2.testcas.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://app2;
}
}
server {
listen 80;
server_name myapp.testcas.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://myapp;
}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
server {
listen 443 ssl;
server_name demo.testcas.com;
ssl_certificate mycas.crt;
ssl_certificate_key mycas.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
#root html;
#index index.html index.htm;
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_pass http://demo;
}
}
}
3.重啟nginx,在瀏覽器輸入demo.testcas.com

說明證書安裝成功。
1.4 導入JDK信任列表
雖然證書生成並且安裝完畢了,但是此證書是不受JDK信任的,在項目進行單點登錄時處理時,會拋出
PKIX path building failed
unable to find valid certification path to requested target
的異常。
下載InstallCert.java文件,放入JDK的bin目錄下,

在當前目錄下,會生成一個jssecacerts文件,把他copy到
.. jdk1.6.0_45\jre\lib\security 目錄下。
這樣就不會報錯了。
單點登錄CAS使用記系列:
-
單點登錄CAS使用記(一):前期准備以及為CAS-Server配置SSL協議
-
單點登錄CAS使用記(二):部署CAS服務器以及客戶端
-
單點登錄CAS使用記(三):實現自定義驗證用戶登錄
-
單點登錄CAS使用記(四):為登錄頁面加上驗證碼
-
單點登錄CAS使用記(五):cas-client不攔截靜態資源以及無需登錄的請求。
-
單點登錄CAS使用記(六):單點登出、單點注銷
-
單點登錄CAS使用記(七):關於服務器超時以及客戶端超時的分析
-
單點登錄CAS使用記(八):使用maven的overlay實現無侵入的改造CAS
