来源:
http://m.blog.csdn.net/zrk1000/article/details/51166603
http://blog.csdn.net/zhurhyme/article/details/24052951
http://blog.csdn.net/liu251890347/article/details/37698239
公司项目使用分布式部署,使用单点登录可使各节点无状态,达到业务与用户认证解耦;cas-server与cas-client通讯安全完全基于https,需要ssl证书,jdk的keytool工具生成的证书用于开发也是够的,当然正式上线的证书需要使用第三方认证的证书;这里介绍下cas开发的准备工作:keytool生成证书。
1、创建证书库
keytool -genkey -alias castest -keyalg RSA -keystore d:/cas/keystore
注意:-alias:别名,这里的castest 为别名; -keystore:指定证书库存放位置,这里存放到d:/cas目录下的keystore文件中,证书库不需要后缀名
注意: 名字与姓氏要填域名,也就是指向部署cas服务的域名,这里必须填域名,不能填ip;没有域名的可以修改C:\Windows\System32\drivers\etc\hosts配置映射(推荐使用小工具SwitchHosts,记得使用管理员权限运行);组织单位名和组织名可以随便填写,国家输入ZH,输入的口令要记住。
2、导出证书:
从证书库中导出证书
keytool -export -file d:/cas/castest.crt -alias castest -keystore d:/cas/keystore
- 1
3、客户端JVM导入证书
cas的client端JVM导入证书,JVM证书库为%JAVA_HOME%/jre/lib/security/cacerts文件,
keytool -import -trustcacerts -alias castest -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -file d:/cas/castest.crt -storepass changeit
**注意:
1、JVM证书库密码默认为changeit
2、使用管理员运行cmd
3、目录若有空格必须使用双引号
可能会用到的命令:
查看cacerts证书库中的证书列表,通过别名搜索
keytool -list -v -keystore “%JAVA_HOME%/jre/lib/security/cacerts” -storepass changeit |findstr /i castest
删除证书库中的证书
keytool -delete -alias castest -keystore “%JAVA_HOME%/jre/lib/security/cacerts” -storepass changeit
4、证书应用到web服务器-tomcat
cas的server服务端tomcat启用SSL,使用HTTPS加密协议。
打开tomcat目录的conf/server.xml文件,开启87行左右的Connector标签的注释代码,并设置keystoreFile、keystorePass如下:
<Connector port="8443" protocol="HTTP/1.1" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="d:/cas/keystore" keystorePass="caspass"/>
到此cas需要的SSL环境准备完毕
CAS取消https方法配置
详细配置修改如下:
1 、 WEB-INF/deployerConfigContext.xml
在
< bean class = "org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref = "httpClient" />
增加参数 p:requireSecure="false" ,是否需要安全验证,即 HTTPS , false 为不采用 如下:
< bean class = "org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref = "httpClient" p:requireSecure= "false" />
2 、 WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml
修改 p:cookieSecure="true" 为 p:cookieSecure=" false " , 即不需要安全 cookie
如下部分:
< bean id = "ticketGrantingTicketCookieGenerator" class = "org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure = " false "
p:cookieMaxAge = "-1"
p:cookieName = "CASTGC"
p:cookiePath = "/cas" />
3 、 WEB-INF\spring-configuration\warnCookieGenerator.xml
修改 p:cookieSecure="true" 为 p:cookieSecure=" false " , 即不需要安全 cookie
结果如下:
< bean id = "warnCookieGenerator" class = "org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure = " false "
p:cookieMaxAge = "-1"
p:cookieName = "CASPRIVACY"
p:cookiePath = "/cas" />
cas 用HTTPS方式访问 安全连接失败
在cas server配置以HTTPS方式,客户端同样请求为HTTPS方式,在各个浏览器下出现错误,如下:
firefox:
chrome:
ie:
ie上看不到任何反应就不贴图了
导致以上结果的原因就是在客户端指定的server地址有问题,不应该指定server的应用端口 而是应该指定为SSL端口443或8443,如:
<filter> <filter-name>CASFilter</filter-name> <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> <init-param> <param-name>casServerLoginUrl</param-name> <param-value>https://cas.my.com:8443/cas/login</param-value> </init-param> <init-param> <param-name>serverName</param-name> <param-value>http://cas.app1.com:8080</param-value> </init-param> </filter>