cas单点登录

浅浅的花香味﹌ 2022-08-12 04:00 403阅读 0赞

来自:http://dylanxu.iteye.com/blog/1871337

CAS单点登录学习笔记四之HTTPS 单向认证方式 服务端和客户端配置

  • 博客分类:
  • Central Authentication Service

cas sso Central Authentication Service 单点登录

一、生成服务端密钥文件
二、生成服务端证书
三、导入证书文件到cacerts密钥库文件
四、服务端Tomcat配置
五、生成客户端密钥库文件
六、客户端应用配置
七、补充说明
八、常见配置错误

配置说明

一、 生成服务端密钥文件

登录服务器打开一个CMD窗口(开始菜单 -> 运行输入cmd后回车)并切换到tomcat安装目录下(如:c:\tomcat-cas),执行如下命令:

keytool -genkey -alias casserver -keypass demosso -keyalg RSA -keystore casserver.keystore -validity 365

1359697154_1952.jpg

执行后,可以看到tomcat安装目录下生成了一个casserver.keystore文件。如下图:

1359696548_5542.jpg

说明:-alias指定别名为casserver;-keyalg指定RSA算法;-keypass指定私钥密码;-keystore指定密钥文件名称为casserver.keystore;-validity指定有效期为365天。另外提示的输入keystore密码应与-keypass指定的相同;您的名字与姓氏是CAS服务器使用的域名(不能是IP,也不能是localhost),其它项随意填。

注意:服务器上如果有多个JDK,请确认环境变量中的JDK路径为tomcat所使用的JDK,如果不在环境变量中,也可切换到指定JDK的bin目录下执行命令;提示的输入keystore密码应与-keypass必须与指定的相同,否则后面tomcat启动会报IO异常(Cannot recover key)。


二、 生成服务端证书

根据以上生成的服务端的密钥文件可以导出服务端证书,执行以下命令:

keytool -export -alias casserver -storepass demosso -file casserver.cer -keystore casserver.keystore

1359697187_1921.jpg

执行后,可以看到tomcat安装目录下生成了一个casserver.cer文件。如下图:

1359697205_5787.jpg

说明:-alias指定别名为casserver;-storepass指定私钥为demosso;-file指定导出证书的文件名为casserver.cer;-keystore指定之前生成的密钥文件的文件名。

注意:-alias和-storepass必须为生成casserver.keystore密钥文件时所指定的别名和密码,否则证书导出失败,报如下错误:

1359697417_9443.jpg


三、 导入证书文件到cacerts 密钥库文件

导入以上生成的服务端的证书文件到一个cacerts密钥库文件,执行以下命令:

keytool -import -trustcacerts -alias casserver -storepass demosso -file casserver.cer –keystore cacerts

1359697645_2422.jpg

执行后,可以看到tomcat安装目录下生成了一个cacerts文件。如下图:

1359697793_8986.jpg


四、 服务端Tomcat配置

在制作完成密钥文件、证书文件、密钥库文件后即可进行服务端Tomcat的配置。打开$CATALINA_HOME/conf/server.xml文件,注释掉如下代码段:

并取消注释代码段,修改后如下:

Java代码 收藏代码

  1. <Connector SSLEnabled=”true” clientAuth=”false”
  2. keystoreFile=”D:/Java/apache/apache-tomcat-cas/casserver.keystore”
  3. keystorePass=”demosso”
  4. maxThreads=”150”
  5. port=”443”
  6. protocol=”org.apache.coyote.http11.Http11Protocol”
  7. scheme=”https” secure=”true” sslProtocol=”TLS”/>

说明:port一般为8443或443,最常用的是443端口(https默认端口),这样https方式访问的时候可以不加端口号(如:https://sso.demo.com/cas/login);keystoreFile为tomcat目录下的密钥文件;keystorePass为私钥密码;truststoreFile为生成的信任文件,如果此处不指定则默认为$JAVA_HOME/jre/lib/security/cacerts文件;其它属性默认即可。


五、 生成客户端密钥库文件

单向认证的客户端配置只需生成客户端信任文件caserts即可。首先将服务端生成的证书文件(之前生成的casserver.cer文件)复制到$JAVA_HOME/jre/lib/security下,然后打开CMD窗口切换到$JAVA_HOME/jre/lib/security下并执行命令:

keytool -import -trustcacerts -alias casclient -storepass changeit -file casserver.cer -keystore cacerts

1359702598_8951.jpg

执行后,可以看到$JAVA_HOME/jre/lib/security目录下生成了一个cacerts文件。如下图:

1359702674_4038.jpg

备注:JDK JRE security storepass 默认密码 changeit

六、 客户端应用配置

1、应用程序WEB-INF\lib目录下加入cas-client-core-3.2.1.jar包并添加到buildpath中;

2、编辑应用程序中的web.xml文件在最末端加入如下内容:

Java代码 收藏代码

  1. org.jasig.cas.client.session.SingleSignOutHttpSessionListener
  2. CAS Single Sign Out Filter
  3. org.jasig.cas.client.session.SingleSignOutFilter
  4. CAS Single Sign Out Filter
  5. /*
  6. CAS Authentication Filter
  7. org.jasig.cas.client.authentication.AuthenticationFilter
  8. casServerLoginUrl
  9. https://sso.demo.com/cas/login
  10. renew
  11. false
  12. gateway
  13. false
  14. serverName
  15. http://localhost:8082
  16. CAS Authentication Filter
  17. /login-page.html
  18. CAS Validation Filter
  19. org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
  20. casServerUrlPrefix
  21. https://sso.demo.com/cas
  22. serverName
  23. http://localhost:8082
  24. useSession
  25. true
  26. redirectAfterValidation
  27. true
  28. CAS Validation Filter
  29. /*
  30. CAS HttpServletRequest WrapperFilter
  31. org.jasig.cas.client.util.HttpServletRequestWrapperFilter
  32. CAS HttpServletRequest WrapperFilter
  33. /*
  34. CAS Assertion Thread Local Filter
  35. org.jasig.cas.client.util.AssertionThreadLocalFilter
  36. CAS Assertion Thread Local Filter
  37. /*
  38. AuthenticationFilter
  39. com.filter.AuthenticationFilter
  40. AuthenticationFilter
  41. /*

Java代码 收藏代码

  1. import java.io.IOException;
  2. import javax.servlet.Filter;
  3. import javax.servlet.FilterChain;
  4. import javax.servlet.FilterConfig;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.ServletRequest;
  7. import javax.servlet.ServletResponse;
  8. import javax.servlet.http.HttpServletRequest;
  9. import org.jasig.cas.client.validation.Assertion;
  10. public class AuthenticationFilter implements Filter {
  11. @Override
  12. public void destroy() {
  13. }
  14. @Override
  15. public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,
  16. ServletException {
  17. HttpServletRequest httpRequest = (HttpServletRequest) request;
  18. // _const_cas_assertion_是CAS中存放登录用户名的session标志
  19. Object object = httpRequest.getSession().getAttribute(“_const_cas_assertion_“);
  20. if (object != null) {
  21. Assertion assertion = (Assertion) object;
  22. String loginName = assertion.getPrincipal().getName();
  23. User user = session 中获取user对象
  24. // 第一次登录系统
  25. if (user == null) {
  26. 自行实现获User对象的方法
  27. //User _user = userService.getUserByName(loginName);
  28. // 保存用户信息到Session
  29. //setCurrentUser(httpRequest, _user);
  30. System.out.println(“current user :” + _user);
  31. }
  32. }
  33. filterChain.doFilter(request, response);
  34. }
  35. @Override
  36. public void init(FilterConfig arg0) throws ServletException {
  37. }
  38. }

说明:LoginFilter内容一般为获取用户基本信息、菜单信息然后保存到session中;sso.demo.com为CAS服务器的域名,也就是之前使用keytool –genkey命令指定的“名字与姓氏”。若未申请域名,也可以本地模拟实现域名解析,编辑C:\WINDOWS\system32\drivers\etc\hosts文件添加:CAS服务器IP sso.demo.com 即可),如下图:

1359703015_1948.jpg

注意:serverName属性值为客户端实际IP地址,可以为域名但绝不能为localhost!

1、 客户端程序单点退出功能,需要访问https://sso.demo.com/cas/logout,下面提供了一个示例,当点击退出按钮(或超链接)时,调用javascript方法ssoLogout()。ssoLogout()定义如下(可根据实际需求自行修改):

[javascript] view plain copy print ?

  1. function ssoLogout(){
  2. if(confirm(‘确定要退出系统吗?’)){
  3. top.location.href =’https://sso.demo.com/cas/logout?service='\+location.protocol+'//'\+location.host+location.pathname;
  4. }
  5. }

七、 补充说明

上面讲的是CAS单独部署的情况,也就是与其它应用分开部署。但有些情况是CAS与其它应用部署到同一台机器同一个Tomcat(关键问题是使用同一个JDK),这种情况下,服务端Tomcat配置中的<Connector truststoreFile属性就要指定为jdk下的cacerts文件路径或者直接注释掉(默认会找$JAVAHOME\jre\lib\security\下的cacerts文件)。这样服务端和客户端是同一个,也就不必再根据服务端证书生成客户端密钥库文件了。

八、 常见配置错误

1、 CAS服务端Tomcat启动后报错:Error initializing endpoint java.io.IOException: Cannot recover key

是由于生成服务端密钥文件时所指定的keypass与提示输入的“keystore密码”不一致。

2、 javax.servlet.ServletException: org.jasig.cas.client.validation.TicketValidationException:绁ㄦ牴’ST-2-hozuLnLtIVGeaD5yju0Y-cas’涓嶇鍚堢洰鏍囨湇鍔?

一般是由于客户端应用web.xml中配置的serverName属性值为localhost或CAS服务端cas-servlet.xml配置文件中的没加p:followServiceRedirects=”true”退出后重定向属性。

3、 SSLHandshakeException: java.security.cert.CertificateException: Nosubject alternative names present

是由于客户端应用web.xml配置中的casServerLoginUrl和casServerUrlPrefix两个URL属性的域名与证书中定义的不一致。

注意:

1、keytool 生成安全证书不能使用IP地址 一律使用域名

2、务必确认客户端程序使用JDK 路径正确 分清楚JDK、JRE

发表评论

表情:
评论列表 (有 0 条评论,403人围观)

还没有评论,来说两句吧...

相关阅读