SSO單點登錄

SSO單點登錄簡介

現在的開發已經發展到了集羣階段,那麼一旦到了集羣的設計階段,出現最明顯的問題:以用戶登錄爲例,所有的web服務器上都需要有用戶登錄的操作。

在整個系統設計的過程之中,現在需要有一個專門的登錄服務器(單獨的域名)進行整體的登錄控制,而後所有的子服務器要根據單點登錄的狀態進行所謂的會話檢測。 但是現在在整個的用戶的認證與授權管理之中,單點登錄只能夠做認證處理,不能夠做授權處理,也就是說如果在實際的開發之中,單點登錄後面一般會有一個用戶的數據庫。

單點登錄

https配置與啓用

爲了得到更加安全的用戶訪問,以及爲了讓你的搜索引擎排名更高,幾乎所有的互聯網公司都轉到了https上。現在的狀態是屬於http與https共存的狀態(小的公司不可能花錢去使用https)。

超文本傳輸協議HTTP,HyperText Transfer Protocol)是是一種詳細規定了瀏覽器和萬維網服務器之間互相通信的規則,通過因特網傳送萬維網文檔的數據傳送協議。

HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。 它是一個URI scheme(抽象標識符體系),句法類同http:體系。

HTTPS和HTTP的區別

超文本傳輸安全協議(HTTPS,也被稱爲HTTP over TLSHTTP over SSLHTTP Secure)是一種網絡安全傳輸協議。
- SSL(Secure Socket Layer)安全套接字層。位於可靠的面向連接的網絡層協議和應用層協議之間的一種協議層。SSL通過互相認證,使用數字簽名確保完整性,使用加密確保私密性,以實現客戶端和服務器之間的通訊安全。該協議由兩層組成:SSL記錄協議和SSL握手協議。核心是加密算法,數字整數,CA。
- TLS(Transport Layer Security)傳輸層安全協議。用於兩個應用程序之間提供保密性和數據完整性。該協議由兩層組成:TLS記錄協議和TLS握手協議。TLSSSL的增強版。

HTTP與HTTPS

HTTPS開發的主要目的是提供對網絡服務器的認證,保證交換信息的機密想和完整性。

爲了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS。爲了數據傳輸的安全,HTTPSHTTP的基礎上加入了SSL協議,SSL依靠證書來驗證服務器的身份,併爲瀏覽器和服務器之間的通信加密。

身份認證流程
TLS三次握手
HTTPS和HTTP的區別主要爲以下四點:

  • https協議需要到ca申請證書,一般免費證書很少,需要交費。
  • http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協議。
  • httphttps使用的是完全不同的連接方式,用的端口也不一樣,前者是80,後者是443
  • http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。

HTTPS是一種安全的訪問,https需要繳費獲得CA證書(公網證書),而https的證書是需要收費的。

使用OpenSSL簽發證書

如果現在哦我們要使用https訪問,那麼一定需要有一個CA機構進行證書的簽發,但是這樣的證書你需要花費銀子的,而且也需要有一個真實的域名存在,我們對於模擬環境就可以自己來進行處理。

CA工作流程

1.生成CA根證書:mkdir -p /srv/ftp/ssocas

openssl genrsa -out /srv/ftp/ssocas/cakey.pem 2048 RSA

openssl req -new -key /srv/ftp/ssocas/cakey.pem -out /srv/ftp/ssocas/cacert.csr -subj /CN=ssocas.com

openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey /srv/ftp/ssocas/cakey.pem -in /srv/ftp/ssocas/cacert.csr -out /srv/ftp/ssocas/ca.cer

生成根證書

2.生成服務器端證書:mkdir -p /srv/ftp/ssocas/server

openssl genrsa -aes256 -out /srv/ftp/ssocas/server/server-key.pem 2048

openssl req -new -key /srv/ftp/ssocas/server/server-key.pem -out /srv/ftp/ssocas/server/server.csr -subj /CN=ssocas.com

openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA /srv/ftp/ssocas/ca.cer -CAkey /srv/ftp/ssocas/cakey.pem -CAserial /srv/ftp/ssocas/server/ca.srl -CAcreateserial -in /srv/ftp/ssocas/server/server.csr -out /srv/ftp/ssocas/server/server.cer

服務器端證書

密碼統一設置爲“mldnjava”

3.客戶端證書:mkdir -p /srv/ftp/ssocas/client

openssl genrsa -aes256 -out /srv/ftp/ssocas/client/client-key.pem 2048

openssl req -new -key /srv/ftp/ssocas/client/client-key.pem -out /srv/ftp/ssocas/client/client.csr -subj /CN=ssocas.com

openssl x509 -req -days 365 -sha1 -CA /srv/ftp/ssocas/ca.cer -CAkey /srv/ftp/ssocas/cakey.pem -CAserial /srv/ftp/ssocas/server/ca.srl -in /srv/ftp/ssocas/client/client.csr -out /srv/ftp/ssocas/client/client.cer

客戶端證書

4.生成Java證書:

openssl pkcs12 -export -clcerts -name cas-client -inkey /srv/ftp/ssocas/client/client-key.pem -in /srv/ftp/ssocas/client/client.cer -out /srv/ftp/ssocas/client/client.p12

openssl pkcs12 -export -clcerts -name cas-server -inkey /srv/ftp/ssocas/server/server-key.pem -in /srv/ftp/ssocas/server/server.cer -out /srv/ftp/ssocas/server/server.p12

keytool -importcert -trustcacerts -alias ssocas.com -file /srv/ftp/ssocas/ca.cer -keystore /usr/local/tomcat/ca-trust.p12

那麼此時本地的JDK就擁有了一個自定義CA認證證書了。

Tomcat配置安全訪問

如果要想在Tomcat之中進行證書的使用,如果要想在Tomcat之中使用證書,需要啓用443端口。
1.打開Tomcat的配置文件:vim /usr/local/tomcat/conf/server.xml

<Connector port="443" protocol="HTTP/1.1" 
    maxThreads="150" SSLEnabled="true" 
    scheme="https" secure="true" 
    clientAuth="false" sslProtocol="TLS" 
    keystoreFile="/srv/ftp/ssocas/server/server.p12" 
    keystoreType="pkcs12"  
    keystorePass="mldnjava" />

2.啓動Tomcat服務器:/usr/local/tomcat/bin/catalina.sh start
3.修改windows本地的hosts配置文件:C:\Windows\System32\drivers\etc

192.168.28.86       ssocas.com

隨後的訪問地址爲:https://ssocas.com
4.如果現在要想實現雙向認證,客戶端需要設置一個證書,則需要做如下修改:

<Connector port="443" protocol="HTTP/1.1"
    maxThreads="150" SSLEnabled="true"
    scheme="https" secure="true"
    clientAuth="true" sslProtocol="TLS" 
    keystoreFile="/srv/ftp/ssocas/server/server.p12"
    keystoreType="pkcs12"
    keystorePass="mldnjava"
    truststoreFile="/usr/local/tomcat/ca-trust.p12"
    truststoreType="jks"
    truststorePass="mldnjava"/>

5.重新啓動tomcat服務器:/usr/local/tomcat/bin/catalina.sh start
6.隨後爲瀏覽器添加證書:ca.cer證書,client.p12證書;

CAS配置與使用

cas簡介與安裝

如果要進行單點登錄一定需要有一臺服務器進行用戶的認證處理,而這臺服務器就可以使用CAS組件完成。
CAS(Central Authentication Service):CASYale大學發起的一個開源項目,旨在爲web應用系統提供一種可靠的單點登錄方法。

CAS具有以下特點:
- 開源的企業級單點登錄解決方案;
- CAS Server爲需要獨立部署的Web應用;
- CAS Client支持非常多的客戶端(指web應用),包括Java、Net、PHP、Perl、Ruby等。

CAS原理及協議

CAS認證一定不再是單一的服務器,而是一個服務器集羣,在服務器集羣之中應該有一個專門的CAS服務器,做整個WEB服務器的認證處理,

CAS整合的處理流程如下:
1.客戶端現在要求正常訪問一個站點,例如:shiro.com
2.shiro.comWEB服務器接收到了用戶的請求之後,由於需要進行認證處理,則將請求重定向給CASWEB服務器,假設現在的CAS域名爲:ssocas.com
3.ssocas.com會發送給用戶一個登錄的表單,隨後需要填寫用戶名和密碼,將登錄信息發送給ssocas.com站點進行認證。
4.當用戶在ssocas.com上已經認證成功之後會由ssocas.com返回一個票根(ticket)給客戶端和服務器端共同進行票根的檢驗;
5.當ssocas.com認證成功之後會將用戶名返回給shiro.com。 如果要想搭建cas,直接將cas-server-webapp-4.1.7.war文件上傳到tomcat服務器之中,爲了方便處理,將項目映射到根路徑之中。

具體操作如下:
1.將上傳後的cas-server.war文件移動到tomcat/webapps目錄之中;
mv /srv/ftp/cas-server.war /usr/local/tomcat/webapps/

2.隨後進行server.xml配置:vim /usr/local/tomcat/conf/server.xml

<Context path="/" docBase="cas-server.war"/>

3.修改一下主機映射:vim /etc/hosts

192.168.28.86 cas-server

4.訪問https://ssocas.com成功則出現以下界面

成功界面

cas提供了一個默認的用戶名和密碼:casuser/Mellon

使用MySQL存儲用戶名和密碼

現在的一個基礎的CAS已經搭建完成了,但是隨後需要注意一個問題,當前使用的cas只能夠使用單一的用戶,在實際開發之中這根本就不可能使用,所以下面需要單獨建立一個MySQL數據庫進行用戶名的存儲。

1.建立數據庫腳本,此時密碼未加密:

DROP DATABASE IF EXISTS shirodb;
CREATE DATABASE shirodb CHARACTER SET UTF8 ;
USE shirodb ;
CREATE TABLE member(
   mid                  varchar(50) not null,
   name                 varchar(30),
   password             varchar(32),
   locked               int,
   CONSTRAINT pk_mid PRIMARY KEY (mid)
) engine='innodb';
-- 0表示活躍、1表示鎖定
INSERT INTO member(mid,name,password,locked) VALUES ('admin','管理員','hello',0) ;
INSERT INTO member(mid,name,password,locked) VALUES ('customer','普通人','java',0) ;
INSERT INTO member(mid,name,password,locked) VALUES ('mermaid','美人魚','hello',1) ;

2.如果要想在cas之中使用jdbc進行認證處理,還需要將相應的開發包配置到cas程序之中;
- 拷貝的包:mchange-commons-java-0.2.12.jar、mysql-connector-java-5.1.32.jar、c3p0-0.9.2.jar、cas-server-support-jdbc-4.1.7.jar
- 拷貝程序包:mv /srv/ftp/*.jar /usr/local/tomcat/webapps/cas-server/WEB-INF/lib/

3.要修改cas的配置文件:vim /usr/local/tomcat/webapps/cas-server/WEB-INF/deployerConfigContext.xml
- 追加數據庫連接池配置:

<!-- 配置使用的數據庫連接池類型,同時設置卸載方法爲close() -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">   
        <property name="jdbcUrl" value="jdbc:mysql://192.168.122.204:3306/shirodb" />
        <property name="driverClass" value="org.gjt.mm.mysql.Driver" />
        <property name="user" value="root" />
        <property name="password" value="mysqladmin" />
        <!-- 最大的數據庫連接量 -->
        <property name="maxPoolSize" value="1" />
        <!-- 最小的數據庫連接維護數量 -->
        <property name="minPoolSize" value="1" />
        <!-- 初始化數據庫連接數量 -->
        <property name="initialPoolSize" value="1" />
        <!-- 等待連接最大時間 -->
        <property name="maxIdleTime" value="20" />
    </bean>
  • 添加數據庫認證處理器:
     <bean id="dbAuthHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">  
             <property name="dataSource" ref="dataSource" />  
             <property name="sql" value="select password from member where mid=? AND locked=0" /> 
     </bean>
    <!-- Required for proxy ticket mechanism. -->
  • 修改認證管理配置:
<bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
        <constructor-arg>
            <map>
                <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
                <entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver" />
            </map>
        </constructor-arg>

修改完成之後,現在就表示該cas服務器已經支持了數據庫認證了。

4.重新啓動Tomcat服務:/usr/local/tomcat/bin/catalina.sh start

密碼加密處理

此時的CAS服務器已經成功的進行了數據庫的連接配置,但是從實際的開發角度而言,不可能使用明文密碼,所以現在將對密碼進行加密控制。
1.如果需要密碼的加密處理的話首先一定要取得已有的密碼加密處理程序。

2.通過cas的發佈的項目目錄之中,拷貝一個cas-server-core-api-4.1.7.jar文件,配置到你自己的項目裏。

3.建立一個新的程序類,該類爲自定義密碼加密處理:

package cn.mldn.util.encoder;
import org.jasig.cas.authentication.handler.PasswordEncoder;
import cn.mldn.util.enctype.PasswordUtil;
//這個類是由CAS自己提供的
public class CustomPasswordEncoder implements PasswordEncoder {

    @Override
    public String encode(String oldPasswd) {//原始密碼,現在需要對原始密碼進行加密

        return PasswordUtil.getPassword(oldPasswd);
    }

}

4.將此時的開發包進行打包處理,生成一個myencoder.jar的程序類。

5.將導出的myencoder.jar的開發包上傳到cas項目之中:
mv /srv/ftp/myencoder.jar /usr/local/tomcat/webapps/cas-server/WEB-INF/lib/

6.修改cas部署文件:vim /usr/local/tomcat/webapps/cas-server/WEB-INF/deployerConfigContext.xml
- 配置密碼加密程序類:

<bean id="passwordEncoder" class="cn.mldn.util.encoder.CustomPasswordEncoder"/>
  • 進行密碼加密配置:
<bean id="dbAuthHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">  
    <property name="dataSource" ref="dataSource" />  
    <property name="sql" value="select password from member where mid=? AND locked=0" /> 
    <property name="passwordEncoder" ref="passwordEncoder"/>
</bean>

7.重新啓動tomcat服務器:/usr/local/tomcat/bin/catalina.sh start

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章