SSO单点登录

来源:互联网 发布:网络推广中介怎么样 编辑:程序博客网 时间:2024/04/28 15:57

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 RSAopenssl req -new -key /srv/ftp/ssocas/cakey.pem -out /srv/ftp/ssocas/cacert.csr -subj /CN=ssocas.comopenssl 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 2048openssl req -new -key /srv/ftp/ssocas/server/server-key.pem -out /srv/ftp/ssocas/server/server.csr -subj /CN=ssocas.comopenssl 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 2048openssl req -new -key /srv/ftp/ssocas/client/client-key.pem -out /srv/ftp/ssocas/client/client.csr -subj /CN=ssocas.comopenssl 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.p12openssl 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.p12keytool -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