现在的开发已经发展到了集群阶段,那么一旦到了集群的设计阶段,出现最明显的问题:以用户登录为例,所有的web服务器上都需要有用户登录的操作。
在整个系统设计的过程之中,现在需要有一个专门的登录服务器(单独的域名)进行整体的登录控制,而后所有的子服务器要根据单点登录的状态进行所谓的会话检测。 但是现在在整个的用户的认证与授权管理之中,单点登录只能够做认证处理,不能够做授权处理,也就是说如果在实际的开发之中,单点登录后面一般会有一个用户的数据库。
为了得到更加安全的用户访问,以及为了让你的搜索引擎排名更高,几乎所有的互联网公司都转到了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
协议需要到ca申请证书,一般免费证书很少,需要交费。http
是超文本传输协议,信息是明文传输,https
则是具有安全性的ssl加密传输协议。http
和https
使用的是完全不同的连接方式,用的端口也不一样,前者是80
,后者是443
。http
的连接很简单,是无状态的;HTTPS
协议是由SSL+HTTP
协议构建的可进行加密传输、身份认证的网络协议,比http
协议安全。HTTPS
是一种安全的访问,https
需要缴费获得CA
证书(公网证书),而https
的证书是需要收费的。
如果现在哦我们要使用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
之中使用证书,需要启用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(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
现在的一个基础的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
;
- 追加数据库连接池配置:
<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>
<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
;
- 配置密码加密程序类:
id="passwordEncoder" class="cn.mldn.util.encoder.CustomPasswordEncoder"/>
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"/>
7.重新启动tomcat
服务器:/usr/local/tomcat/bin/catalina.sh start
;