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 TLS
,HTTP over SSL
或HTTP Secure
)是一種網絡安全傳輸協議。
- SSL:(Secure Socket Layer)
安全套接字層。位於可靠的面向連接的網絡層協議和應用層協議之間的一種協議層。SSL通過互相認證,使用數字簽名確保完整性,使用加密確保私密性,以實現客戶端和服務器之間的通訊安全。該協議由兩層組成:SSL記錄協議和SSL握手協議。核心是加密算法,數字整數,CA。
- TLS:(Transport Layer Security)
傳輸層安全協議。用於兩個應用程序之間提供保密性和數據完整性。該協議由兩層組成:TLS
記錄協議和TLS
握手協議。TLS
是SSL
的增強版。
HTTPS
開發的主要目的是提供對網絡服務器的認證,保證交換信息的機密想和完整性。
爲了解決HTTP
協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS
。爲了數據傳輸的安全,HTTPS
在HTTP
的基礎上加入了SSL
協議,SSL
依靠證書來驗證服務器的身份,併爲瀏覽器和服務器之間的通信加密。
HTTPS和HTTP的區別主要爲以下四點:
https
協議需要到ca申請證書,一般免費證書很少,需要交費。http
是超文本傳輸協議,信息是明文傳輸,https
則是具有安全性的ssl加密傳輸協議。http
和https
使用的是完全不同的連接方式,用的端口也不一樣,前者是80
,後者是443
。http
的連接很簡單,是無狀態的;HTTPS
協議是由SSL+HTTP
協議構建的可進行加密傳輸、身份認證的網絡協議,比http
協議安全。
HTTPS
是一種安全的訪問,https
需要繳費獲得CA
證書(公網證書),而https
的證書是需要收費的。
使用OpenSSL簽發證書
如果現在哦我們要使用https
訪問,那麼一定需要有一個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)
:CAS
是Yale大學發起的一個開源項目,旨在爲web
應用系統提供一種可靠的單點登錄方法。
CAS
具有以下特點:
- 開源的企業級單點登錄解決方案;
- CAS Server爲需要獨立部署的Web
應用;
- CAS Client支持非常多的客戶端(指web
應用),包括Java、Net、PHP、Perl、Ruby
等。
CAS
認證一定不再是單一的服務器,而是一個服務器集羣,在服務器集羣之中應該有一個專門的CAS
服務器,做整個WEB服務器的認證處理,
CAS整合的處理流程如下:
1.客戶端現在要求正常訪問一個站點,例如:shiro.com
;
2.shiro.com
的WEB
服務器接收到了用戶的請求之後,由於需要進行認證處理,則將請求重定向給CAS
的WEB
服務器,假設現在的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
;