單點登陸CAS使用記(一):前期準備以及爲CAS-Server配置SSL協議

知識點:html

SSO:單點登陸(Single Sign On),是目前比較流行的企業業務整合的解決方案之一。SSO的定義是在多個應用系統中,用戶只須要登陸一次就能夠訪問全部相互信任的應用系統。java

CAS:耶魯大學開發的單點登陸(Single Sign On)系統稱爲CAS(Central Authentication Server),他是一個開源的、相對比較簡單易用的SSO解決方案。nginx

SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是爲網絡通訊提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層對網絡鏈接進行加密。瀏覽器

 

背景:tomcat

目前公司有相互關聯的幾個獨立項目,須要使用單點登陸進行整合,實現一站登陸,全站皆能夠訪問。選用CAS開源項目。安全

 

現狀:服務器

由於以前沒有作過,因此只能邊查、邊學、邊作。有一些網絡上查不到的需求,只能分析CAS源碼,採起折中處理方式來實現,若是你們發現有不合理處理方式,請隨時批評指正。網絡

另外,寫這篇博文的時候,單點登陸功能基本已經實現完畢了,這裏回顧記錄一下學習過程。session

------------------------------------------分割----------------------------------------------app

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;
        }
    }

}
View Code

 

 

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使用記系列:

相關文章
相關標籤/搜索