基于CAS的SSO实践

本人小白一枚,借鉴网上大牛们的经验,实现了基于CAS的SSO单点登录功能,一步一个脚印,一个脚印一个坑,好在最后实现。(后附参考文献,不分先后)

【演示环境】

1.jdk-7u67-windows-x64.exe(最好只装一个版本的jdk,避免出现意外错误)

2.apache-tomcat-7.0.76.zip(非安装版)

3.cas-server-4.0.0-release.zip(cas服务端)

4.cas-client-3.2.0-release.zip(cas客户端)

【环境说明1】

    修改hosts文件添加域名,C:\Windows\System32\drivers\etc\hosts 在文件末端添加下面三条信息:

127.0.0.1 sso.server.com(对应部署casserver的tomcat)

127.0.0.1 sso.client1.com(对应部署cas client1的tomcat)

127.0.0.1 sso.client2.com(对应部署cas client2的tomcat)

【注意】 这个非常重要,因为CAS单点登录系统是基于JAVA安全证书的https协议,要使用CAS单点登录必须要配置域名, cas server是不能通过ip访问的。

上面3个ip都是127.0.0.1,这是因为我的环境都是在同一台机器,所以ip都是一致的。一个域名对应一个应用,模拟多端。

C:\Windows\System32\drivers\etc\hosts以记事本格式打开,该文件用于IP地址与主机名的对应,每条对应单独一行,以”#”标示机器名(machine name)。每行起始的#是注释意思,

【环境说明2】

安全证书配置阶段需要提前配置好java环境,可以官网下载jdk-7u67-windows-x64.exe。jdk-7u67-windows-x64.exe安装成功后需要对JDK环境变量进行配置,见图1、图2,开始->控制面板->更改设置

                                                                         图1 新建系统变量JAVA_HOME

       在系统变量里新建JAVA_HOME,值就是该 jdk-7u67-windows-x64.exe的安装位置,这些配置会在后面生成、导出、导入证书,启动Tomcat,反复使用,所以变量值不要太长,否则后面在cmd中反复输入该路径,会烦到怀疑人生。

       那么,怎么设置一个较短的值呢?Java前不要太长,就像我这样即可。

                                                                           图2 设置JAVA_HOME变量值

【安全证书配置】

说明

本教程目的在于演示,所以使用JDK自带的keytool工具生成证书。如若在产品环境中使用,需要向证书提供商购买,证书认证一般由 VeriSign认证,中文官方网站: http://www.verisign.com/cn/

本教程全部取自实操环境,由于报错与调试迭代原因,存在图片截取时间前后不一致情况,但是不影响整个工程实现,直接参考图片操作部分即可。

1>.打开cmd命令窗口(管理员身份打开)

开始—>cmd—>右键选择“以管理员身份运行”

cd到C盘根目录或者是jdk的bin目录下,

cd  C:\Program Files\Java\jdk1.7.0_80\bin  回车,进入java运行,见图3。

 

                                                                                       图3 进入java运行

2>.生成证书,在java运行环境的cmd窗口输入以下命令:

keytool -genkey -alias ssodemo -keyalg RSA -keysize 2048 -keypass 123456 -validity 365 -keystore c:\wsriakey -storepass 123456

       以上命令的执行会在c:\目录下自动新建一个名为wsriakey的文件(证书库)。

可以通过以下命令查看记录于其中的证书内容,

keytool –list –v –alias ssodemo –keystore c:\wriaskey –storepass 123456

该命令意味着查询位于c:\的wsriakey证书库文件中,别名为ssodemo的证书记录。见图4。

                                                            图4 证书库wriaskey中别名为ssodemo的证书记录

说明

这段命令的意思是:生成一个证书,别名是ssodemo,采用非对称加密算法RSA,密钥长度2048位,该证书有效期365天,存放在c:\wsriakey并命名为wsriakey,存储密码为123456。

keytool 是jdk提供的工具,该工具名为”keytool“。

-genkey:创建证书。

-alias:证书的别名,可以自定义。在一个证书库文件中,别名是唯一用来区分多个证书的标识符。

-keyalg:密钥的算法,可以选择的密钥算法有:RSA、DSA、EC。

keyalg=RSA时,签名算法有:MD5withRSA、SHA1withRSA、SHA256withRSA、SHA384withRSA、SHA512withRSA。keyalg=DSA时,签名算法有:SHA1withDSA、SHA256withDSA。此处需要注意:MD5和SHA1的签名算法已经不安全。

-keystore:证书库()文件保存的位置和文件(证书库)名。如果路径写错的话,会出现报错信息。如果在路径下,证书库文件不存在,那么就会创建一个。

-keysize:密钥长度,keysize与keyalg存在默认对应关系,其中:

2048 (when using -genkeypair and -keyalg is “RSA”),

1024 (when using -genkeypair and -keyalg is “DSA”),      

256 (when using -genkeypair and -keyalg is “EC”)。

-validity:证书的有效期,单位天。比如36500就是100年
    -keypass password (用来access the particular key pair's private key)此处”password “为本条目的密码(私钥的密码)。最好与storepass一致。

    -storepass mypassword (用来access the key store)此处”mypassword “为证书库密码(私钥的密码)。最好与keypass 一致

-storetype JKS 此处”JKS “为证书库类型。可用的证书库类型为:JKS、PKCS12等。jdk9以前,默认为JKS。自jdk9开始,默认为PKCS12。

CN= 名字与姓氏/域名,本实例填写sso.server.com

OU= 组织单位名称, 本实例填写server.com

O= 组织名称, 本实例填写ssodemo

L= 城市或区域名称, 本实例填写tianjin

ST= 州或省份名称, 本实例填写tianjin

C= 单位的两字母国家代码, 本实例填写CN    

    必须输入在C:\Windows\System32\drivers\etc\hosts文件中加入的服务端的域,本实例CN=sso.server.com,为何这么做?

首先cas只能通过域名来访问,不能通过ip访问;其次,由于上方是要求比较严格的证书生成,如果不这么做的话,即使最终按照教程配置完成,cas也可以正常访问,访问一个客户端应用也能进入cas验证首页,但是,当输入信息正确后,cas在回调转入你想访问的客户端应用的时候,会出现No subject alternative names present错误异常信息,这个错误就是由CN输入不是域名导致,或者与hosts文件配置的不一致导致。

在C:\目录下得到一个wsriakey的(证书库)文件,见图5。

                                                               图5 c:\目录下得到一个wsriakey的(证书库)文件

如果继续向同一证书库生成同一别名的证书,会报错,见图6,

                                                                           图6 证书库中证书别名不能冲突

3>.导出证书(根据私钥导出服务端证书):

在cmd窗口继续输入以下命令,导出证书:

keytool -export -alias ssodemo -keystore c:\wsriakey -file c:\wsria.crt -storepass 123456

说明

-alias后面的名称要与生成证书的命令里面的alias的名称一致; –keystore指定证书存放的位置,本实例放在C盘根目录,同时证书名称要与”生成证书”对应的命令里的keystore名称一致,这里是wsriakey;-file指定导出证书的路径(crt路径),本实例也指定在c盘根目录;-storepass的证书密码要与上面输入的密码一致。

       该命令意思是,将生成在在证书库c:\wsriakey中别名为ssodemo的证书记录(密钥对),导出到“c:\ ”,并命名为wsria.crt证书,其中,-storepass即为生成证书时的证书库访问密码。见图7 证书导出。

                                                                                   图7 证书导出

4>.导入证书(客户端导入证书):  

keytool -import -keystore %JAVA_HOME%\jre\lib\security\cacerts -file c:\wsria.crt -alias ssodemo

说明

命令中指定了JAVA_HOME,意思是将证书导入到客户端证书库,也就是jdk证书库中,因为客户端应用运行在本地,需要jdk的支持。-file指已生成导出的证书的位置和证书名,也就是上一步导出(-export)证书的位置,即c:\wsria.crt。%JAVA_HOME%指证书库cacerts的绝对路径,可以用“c:\program files\java\jdk1.7.0_80\jre\lib\security\cacerts”(记得命令输入时带双引号),也可以用$JAVA_HOME\ jre\lib\security\cacerts(此时不用接双引号)。

       该命令的意思是,将位于C:\的证书wsria.crt中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值