SSO单点登录-概念简介及证书生成

/ 单点登录 / 没有评论 / 2610浏览

     最近按照局方要求我们的大数据标签库系统需要使用单点登录接入;当时把任务分配给了新来的同事;由于没有接触过单点登录,所有对整个流程比较陌生;心里没底。所以才有写这篇博文的想法;想从零开始和介绍一下单点登录如何实现。

     一、为什么要用单点登录

     稍微上规模一点的公司内部往往会有很多系统,例如:OA系统、邮件系统、运营支持系统、人力资源考勤系统等等,像运营商的内部系统日常使用的至少也有十几二十多个;这些系统建设时间右前右后,使用的技术五花八门;每个系统都有自己的一套账号权限。每个系统相对独立;对于使用者来着;日常使用20个系统就要记住20个账号密码;没登录一个系统哪怕使用同样的账号密码都需要重复登录;这给使用者带来了非常差的体验。为了解决这个问题,SSO单点登录应运而生;目的就是:一处(一个系统)登录、处处(各个系统)有效。这样用户只要登录一次就可以在各个系统之间无缝畅游。

     二、SSO、CAS SSO、单点登录都是什么东西?

      单点登录简称SSO,CAS SSO 只是支持单点登录场景的一个解决方案;单点登录还有其他收费的方案。

     三、搭建单点登录服务器端和客户端实践

         先简单介绍一下本次实践demo的结构:

             客户端1   client1.huzd.com 

             客户端2  client2.huzd.com

             服务器端 server.huzd.com

             这里想说下为什么要用域名;因为证书生成的需要!这里需要把这三个域名在 hosts文件中映射到127.0.0.1 

      (一)、了解CAS SSO单点登录的原理:

             关于单点登录原理性的文章网上巨多;个人感觉写的比较好的是这篇:https://blog.csdn.net/javaloveiphone/article/details/52439613 大家可以先行点开学习一下;这里我就不再赘述。这里我借用一张官方的图来展开后面的内容。

              

      (二)、证书生成

             证书在单点登录过程中扮演着非常关键的角色;一方面我们要使用https协议去访问单点登录的服务器也就是上图中的步骤2;此外客户端和服务器端之间通讯验证票据有效性时也要使用证书进行加密上图中的5。下面详细介绍下如何生成证书,这当中有些坑等着大家。

             1、使用JDK内置工具生成证书:

keytool -genkey -alias huzd -keyalg RSA -keystore /Users/huzd/Downloads/huzd

输入密钥库口令: 再次输入新口令: 您的名字与姓氏是什么? [Unknown]: server.huzd.com (备注:这里一定要是你单点登录服务器端的域名地址;否则在后台通讯步骤5时会出错!!) 您的组织单位名称是什么? [Unknown]: sitech 您的组织名称是什么? [Unknown]: bds 您所在的城市或区域名称是什么? [Unknown]: Hefei 您所在的省/市/自治区名称是什么? [Unknown]: Anhui 该单位的双字母国家/地区代码是什么? [Unknown]: CN CN=server.huzd.com, OU=sitech, O=bds, L=Hefei, ST=Anhui, C=CN是否正确? [否]: y

输入 <huzd> 的密钥口令 (如果和密钥库口令相同, 按回车):

             2、导出证书:

keytool -export -file /Users/huzd/Downloads/huzd.crt -alias huzd -keystore /Users/huzd/Downloads/huzd

这里是指定路径;不带路径会在当前登录用户下。这里还是建议指定路径。

             3、证书导入JDK中:

sudo keytool -import -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/jre/lib/security/cacerts -file /Users/huzd/Downloads/huzd.crt

这里会打印一些证书的信息;直接敲Y,确认就好。
这里为什么要导入证书到JDK中呢?还是步骤5,我跟踪了代码(AbstractCasProtocolUrlBasedTicketValidator.retrieveResponseFromServer())发现后台会使用模拟https请求去访问服务器端的地址本例中是:
https://server.huzd.com:8443/cas-server/serviceValidate?&ticket=ST-14-5EYZgNwZ2DjifdxwyIXB-server.huzd.com&service=http%3A%2F%2Fclient1.huzd.com%3A8888%2F 这个是客户端的JDK发起的;
所以客户端需要使用到证书;这里的证书服务器端也会用到;后面会介绍。

             第3步中如果出现:keytool 错误: java.io.IOException: Keystore was tampered with, or password was incorrect 解决办法:备份并且删除/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/jre/lib/security/cacerts