单点登录(SSO)


好久没发表什么文章了,也不是不发,是没研究什么东西。最近在做一个门户项目,要用到单点登录这个功能,所以就开始研究起了单点登录,开源的框架也挺多的,但是好像也都不怎么适用,网上关于单点登录的资料又少的可怜。最后跟领导商议用耶鲁大学的开源框架CAS进行研究及开发。下面在研究过程中一些笔记,有些也是在网上找到的。都是按照这个流程走下来的,在中途遇到好多莫名其妙的问题,有些事解决了,但是还有些小问题没能彻底解决,但是能跑的动,如果大家有兴趣的话,可以一起讨论。

       下面为具体的流程



                       单点登录

SSO是目前比较流行的企业业务整合的解决方案之一,它定义在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
CAS 是Yale(耶鲁)大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,在2004年12月正式成为JA-SIG的一个项目。目前,也已经有许多应用CAS实现单点登录的成功案例。



一、下载所需软件

CAS Server:http://www.jasig.org/cas/download
CAS Client:http://downloads.jasig.org/cas-clients/


本文下载的版本是:
cas-server-3.4.11-release.zip
cas-client-3.2.1-release.zip



二、配置过程
1、Tomcat
本文将配置一个单独的Tomcat环境将CAS用,因为原有的Tomcat可能要用于其它项目的开发,就不想在原有上面的Tomcat开刀了。

下载apache-tomcat-6.0.30-windows-x64.zip,解压到C盘,并命名为:Tomcat6_CAS

因为要存在多个Tomcat,所以新建环境变量:
CATALINA_HOME_CAS=C:\Tomcat6_CAS
CATALINA_BASE_CAS=C:\Tomcat6_CAS



然后修改Tomcat下所有指向CATALINA_HOME和CATALINA_BASE,可以用DW一次性打开C:\Tomcat6_CAS\bin下面的所有.bat文件,然后利用查找替换功能一次搞定。

修改Tomcat6_CAS的http访问端口为80端口(因为到时要用域名访问,需要修改hosts,而hosts不支持端口号),打开conf/server.xml,修改成:

<Connector port="80" protocol="HTTP/1.1"

           connectionTimeout="20000"

           redirectPort="8443" />



启动Tomcat,访问http://127.0.0.1 看看能不能打开。


映射域名(此处使用gevin.me作为例子),修改C:\Windows\System32\drivers\etc\hosts文件,增加以下记录:

127.0.0.1 sso.gevin.me (这个是域名,在生成证书的时候根据自己的情况,填写自己的域名,什么都可以)
访问http://sso.gevin.me,看看能不能访问,如图:








要实现CAS SSO,必须让Tomcat支持SSL,下面将讲一下如何配置SSL。

本文使用的Tomcat版本是:apache-tomcat-6.0.30-windows-x64.zip

一、生成Key Store

1 C:\Java\jdk1.6.0_27\bin>keytool -genkey -alias "tomcat" -keyalg "RSA" -keystore "C:\Tomcat6_CAS\keystore\gevinme.keystore" -validity 360









注意:第一个问一定要填写cas server的域名,否则到时访问客户端程序时将会报以下的错误:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching xxx.xxx.xx found
参数介绍:

-alias 密钥的别名

-keyalg 密钥使用的加密算法,此处使用RSA

-keystore 密钥存储的位置,默认是存在用户主目录下,此处则指定存储位置

-validity 密钥的有效期

更多关于keytool的参数说明请参考《JDK keytool参数说明》

keystore的密码我设置为gevinme,与Tomcat的管理员密码一样,tomcat-user.xml额外增加了以下权限:

<tomcat-users> 

<user username="admin" password="gevinme" roles="admin,manager"/> 

</tomcat-users>




执行完上述命令后,将会在指定的目录下生成gevinme.keystore文件,如图:













二、配置SSL连接器

修改Tomcat\conf\server.xml文件

将以下的内容的注释去掉,并增加以下密钥位置和密码:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"

               maxThreads="150" scheme="https" secure="true"

                clientAuth="false" sslProtocol="TLS"

                keystoreFile="C:\Tomcat6_CAS\keystore\gevinme.keystore"

               keystorePass="gevinme"

                />
此时启动后会报以下错误:

1 java.lang.exception connector attribute sslcertificatefile must be defined when using ssl with apr

只需要将conf\server.xml里面的以下内容注释掉即可:

<!-- 

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> 

-->



三、测试访问:

启动Tomcat,访问https://127.0.0.1:8443








点击“证书错误”后,可以查看到我们刚刚生成的密钥的相关信息:







至此,Tomcat的SSL配置过程已完成,下面将介绍如何导出证书和客户端如何导入服务器端生成的证书,为之后的SSO做准备。

四、导出证书



1 C:\Java\jdk1.6.0_27\bin>keytool -export -alias tomcat -file "C:\Tomcat6_CAS\keystore\gevinme.cert" -keystore "C:\Tomcat6_CAS\keystore\gevinme.keystore"





五、客户端导入证书

在运行客户端程序的机器上导入证书,需要注意的是此入导入的jre必须是Tomcat指向的jre。(本文在同一台机器上测试)

1 C:\Java\jdk1.6.0_27\bin>keytool -import -alias tomcat_client -trustcacerts -file "C:\Tomcat6_CAS\keystore\gevinme.cert" -keystore "C:\Java\jre6\lib\security\cacerts"




如果看到这个图显示的东西时,说明你的证书已经生成,并且把证书已经导入到客户端。

未完有时间再续~~~~

猜你喜欢

转载自lwazl1314.iteye.com/blog/1652650