知识点:

SSO:单点登录(Single Sign On),是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

CAS:耶鲁大学开发的单点登录(Single Sign On)系统称为CAS(Central Authentication Server),他是一个开源的、相对比较简单易用的SSO解决方案。

SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。

背景:

目前公司有相互关联的几个独立项目,需要使用单点登录进行整合,实现一站登录,全站皆可以访问。选用CAS开源项目。

现状:

因为之前没有做过,所以只能边查、边学、边做。有一些网络上查不到的需求,只能分析CAS源码,采取折中处理方式来实现,如果大家发现有不合理处理方式,请随时批评指正。

另外,写这篇博文的时候,单点登录功能基本已经实现完毕了,这里回顾记录一下学习过程。

------------------------------------------分割----------------------------------------------

1.开发环境准备

证书生成工具:OpenSSL

服务器:Ngnix + tomcat

SSO框架:CAS

1.1 首先创建本地域名

demo.testcas.com 用来绑定CAS-Server

app1.testcas.com、app1.testcas.com 绑定两个测试demo,用来验证免登陆处理。

创建方法:

进入:C:\WINDOWS\system32\drivers\etc

打开:hosts文件

添加如下:

127.0.0.1 demo.testcas.com
      127.0.0.1 app1.testcas.com
      127.0.0.1 app2.testcas.com

1.2 生成安全证书

Cas server默认的安全认证是基于https协议的,这就要求在应用程序和CAS Server端配置SSL协议。

一般网络上生成自用的不受浏览器信任的证书都是直接通过JDK自带的应用keytool来制作的,但是因为我们用了Ngnix作为代理服务器,

而Ngnix不兼容keytool生成的证书来部署HTTPS网站,所以需要使用OpenSSL来生成证书。

1. 安装OpenSSL

2. 进入OpenSSL安装目录,我的安装路径:D:\developesoft\openssl\openssl

同时,在bin目录下建立几个文件和文件夹,

有./demoCA/ ./demoCA/newcerts/ ./demoCA/index.txt ./demoCA/serial,在serial文件中写入第一个序列号“01”

3. 命令模式 进入 bin 目录

D:\developesoft\openssl\openssl\bin

4.生成CA私钥:

输入:openssl genrsa -des3 -out ca.key 2048

如果报红线标注的Warning,那么把安装目录下的ssl/openssl.cnf 拷贝到 指定目录c:/openssl/ssl/openssl.cnf下,重新执行命令

5.ca.crt CA根证书(公钥):

openssl req -new -x509 -days 7305 -key ca.key -out ca.crt

6.制作生成网站的证书并用CA签名认证

我的测试网站域名为demo.testcas.com

生成demo.testcas.com证书私钥:

openssl genrsa -des3 -out demo.testcas.com.pem 1024

制作解密后的demo.testcas.com证书私钥:

openssl rsa -in demo.testcas.com.pem -out demo.testcas.com.key

生成签名请求:

openssl req -new -key demo.testcas.com.pem -out demo.testcas.com.csr

Common Name处输入网址域名,其他随便填写都行

用CA进行签名:

openssl ca -policy policy_anything -days 1460 -cert ca.crt -keyfile ca.key -in demo.testcas.com.csr -out demo.testcas.com.crt

在OpenSSL安装目录的bin目录下,可以看到生成的证书与私钥

demo.testcas.com.crt

demo.testcas.com.key

1.3 为nginx配置https

1.下载并安装nginx,双击nginx.exe,在浏览器地址栏输入:127.0.0.1,确认是否安装成功。

2.打开conf/nginx.conf

找到# HTTPS server,做如下配置:

  # HTTPS server
#
server {
listen 443 ssl;
server_name demo.testcas.com; ssl_certificate demo.testcas.com.crt;
ssl_certificate_key demo.test.cas.com.key; ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on; location / {
#root html;
#index index.html index.htm;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://demo;
}
}

红字部分为刚才生成证书的路径,可以直接把这证书copy到nginx安装目录下。

另外,当用户输入http请求时,直接跳转到https请求

server {
listen 80;
server_name demo.testcas.com;
rewrite ^(.*)$ https://$host$1 permanent; #charset koi8-r; #access_log logs/host.access.log main; location / {
#root html;
#index index.html index.htm;
proxy_pass http://demo;
}
}

配置全文如下:

#user  nobody;
worker_processes 1; #error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info; #pid logs/nginx.pid; events {
worker_connections 1024;
} http {
include mime.types;
default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on;
#tcp_nopush on; #keepalive_timeout 0;
keepalive_timeout 65; #gzip on; upstream demo {
server 127.0.0.1:8781;
} upstream app1 {
server 127.0.0.1:8380;
} upstream app2 {
server 127.0.0.1:8680;
} upstream myapp {
server 127.0.0.1:8084;
} server {
listen 80;
server_name demo.testcas.com;
rewrite ^(.*)$ https://$host$1 permanent; #charset koi8-r; #access_log logs/host.access.log main; location / {
#root html;
#index index.html index.htm;
proxy_pass http://demo;
}
} server {
listen 80;
server_name app1.testcas.com; #charset koi8-r; #access_log logs/host.access.log main; location / {
#root html;
#index index.html index.htm;
proxy_pass http://app1;
}
} server {
listen 80;
server_name app2.testcas.com; #charset koi8-r; #access_log logs/host.access.log main; location / {
#root html;
#index index.html index.htm;
proxy_pass http://app2;
}
} server {
listen 80;
server_name myapp.testcas.com; #charset koi8-r; #access_log logs/host.access.log main; location / {
#root html;
#index index.html index.htm;
proxy_pass http://myapp;
}
} # another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias; # location / {
# root html;
# index index.html index.htm;
# }
#} # HTTPS server
#
server {
listen 443 ssl;
server_name demo.testcas.com; ssl_certificate mycas.crt;
ssl_certificate_key mycas.key; ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on; location / {
#root html;
#index index.html index.htm;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://demo;
}
} }

3.重启nginx,在浏览器输入demo.testcas.com

说明证书安装成功。

1.4 导入JDK信任列表

虽然证书生成并且安装完毕了,但是此证书是不受JDK信任的,在项目进行单点登录时处理时,会抛出

PKIX path building failed

unable to find valid certification path to requested target

的异常。

下载InstallCert.java文件,放入JDK的bin目录下,

在当前目录下,会生成一个jssecacerts文件,把他copy到

.. jdk1.6.0_45\jre\lib\security 目录下。

这样就不会报错了。


单点登录CAS使用记系列:

单点登录CAS使用记(一):前期准备以及为CAS-Server配置SSL协议的更多相关文章

  1. 单点登录系统构建之二——SSO原理及CAS架构

    基本概念 SSO(Single Sign On)单点登录,是在多个应用系统中,用户只需要登录一次就能访问所有相互信任的应用系统.它包括将这次的主要登录映射到其他应用中用户同一个用户的登录机制. SSO ...

  2. 单点登录CAS使用记(二):部署CAS服务器以及客户端

    CAS-Server下载地址:https://www.apereo.org/projects/cas/download-cas CAS-Client下载地址:http://developer.jasi ...

  3. 单点登录CAS使用记(三):实现自定义验证用户登录

    问题: CAS自带的用户验证逻辑太过简单,如何像正常网站一样,通过验证DB中的用户数据,来验证用户以及密码的合法性呢? 方案1:CAS默认的JDBC扩展方案: CAS自带了两种简单的通过JDBC方式验 ...

  4. 单点登录CAS使用记(四):为登录页面加上验证码

    CAS默认的登录页面样式如下,只有用户名与密码两项验证项目. 现在需要为首页登录加上验证码功能. 第一步:首页对默认登录页面的样式进行了调整,使其看上去还算美观. 在页面上加上了验证码项目. 第二步: ...

  5. 单点登录CAS使用记(五):cas-client不拦截静态资源以及无需登录的请求。

    一.问题在哪? 在配置cas-client中,有这么一段配置: <filter> <filter-name>CAS Filter</filter-name> < ...

  6. 单点登录CAS使用记(六):单点登出、单点注销

    单点登出基本上没有啥配置 直接在原来logout的时候,重定向到Cas-Server的logout方法 @RequestSecurity @RequestMapping(value = "l ...

  7. 单点登录CAS使用记(七):关于服务器超时以及客户端超时的分析

    我的预想情况 一般情况下,当用户登录一个站点后,如果长时间没有发生任何动作,当用户再次点击时,会被强制登出并且跳转到登录页面, 提醒用户重新登录.现在我已经为站点整合了CAS,并且已经实现了单点登录以 ...

  8. 单点登录CAS使用记(八):使用maven的overlay实现无侵入的改造CAS

    前期在学习CAS部署的过程中,都是网上各种教程,各种方案不停的尝试. 期间各种侵入改源码,时间久了,改了哪个文件,改了哪段配置,增加了哪段代码,都有可能混淆不清了. 而且最大的问题是,万一换个人来维护 ...

  9. cas sso单点登录系列7_ 单点登录cas常见问题系列汇总

    转:http://blog.csdn.net/matthewei6/article/details/50709252 单点登录cas常见问题(一) - 子系统是否还要做session处理?单点登录ca ...

随机推荐

  1. 转:PHP 使用ZipArchive压缩文件并下载

    原文来自于:http://courages.us/archives/176 网站上需要提供一些打印数据给用户下载,这些文件每次都需要重新生成,因为随时都会有新的数据产生.网络上关于PHP的压缩功能实现 ...

  2. 转:更改 centos yum 源

    centos下可以通过yum很方便快捷的安装所需的软件和库,如果yum的源不好,安装速度会非常慢,centos默认官方源似乎都是国外的,所以速度无法保证,我一直使用163的源,感觉速度不错.下面就说说 ...

  3. centos7 install jdk

    setp1: remove default java [lhs@localhost soft]$ rpm -qa | grep javajava-1.7.0-openjdk-1.7.0.75-2.5. ...

  4. spring restful 中文乱码问题

    进行如下配置: @RequestMapping( value="/zzs/xgm", produces="application/json;charset=utf-8&q ...

  5. 关于RESTful

    http://www.ruanyifeng.com/blog/2011/09/restful.html (1)每一个URI代表一种资源: (2)客户端和服务器之间,传递这种资源的某种表现层: (3)客 ...

  6. QT的的字体使用(全局自带字体特别好用)

    WIN10下的默认字体居然是Segoe UI,造成各Windows版本显示不一致,可以这样修改Windows的默认字体(重启后生效): [HKEY_LOCAL_MACHINE>>SOFTW ...

  7. 14.2 InnoDB and the ACID Model

    14.2 InnoDB and the ACID Model ACID 模型是一组数据库设计原则,强调可靠性方面对于商业数据和关键人物. MySQL 包含组件比如InnoDB存储引擎坚持ACID 模型 ...

  8. mklink命令转移win7系统盘文件夹users和programdata(附xp的方法)

    mklink命令转移win7系统盘文件夹users和programdata(附xp的方法)                   使用mklink命令转移文件夹清理臃肿的c盘        (一) 我的 ...

  9. Javascript 操作select控件大全(新增、修改、删除、选中、清空、判断存在等)

    1判断select选项中 是否存在Value="paraValue"的Item 2向select选项中 加入一个Item 3从select选项中 删除一个Item 4删除selec ...

  10. 关于java函数参数的修改能否带出来

    结论 1. java的8个基本类型,无论是简单类型(比如int)还是类类型(比如Integer),传到形参里的变量,在函数体内修改之后是带不出来的. 2. String类型也是带不出来的. 3. 数组 ...