CAS单点登录系列(1)-基础知识

1. 单点登录

1.1. 概述

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

1.2. 技术实现机制

当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,应该返回给用户一个认证的凭据--ticket;用户再访问别的应用的时候,就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行效验,检查ticket的合法性。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。

1.3. 要实现SSO需要以下主要的功能

所有应用系统共享一个身份认证系统;

所有应用系统能够识别和提取ticket信息;

应用系统能够识别已经登录过的用户,能自动判断当前用户是否登录过,从而完成单点登录的功能。

其中,统一的身份认证系统最重要,认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户。另外,认证系统还应该对ticket进行效验,判断其有效性。整个系统可以存在两个以上的认证服务器,这些服务器甚至可以是不同的产品。认证服务器之间要通过标准的通讯协议,互相交换认证信息,就能完成更高级别的单点登录。

2. 数字签名

2.1. 概念

数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。

2.2. 主要功能

保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。

数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程 中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。

数字签名是个加密的过程,数字签名验证是个解密的过程。

2.3. 数字签名的流程

3. 数字证书

3.1. 概念

数字证书就是互联网通讯中标志通讯各方身份信息的一系列数据,提供了一种在Internet上验证您身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构—CA机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份。数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。

3.2. 颁发过程

数字证书颁发过程一般为:用户首先产生自己的密钥对,并将公共密钥及部分个人身份信息传送给认证中心。 认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证中心的签名信息。用户就可以使用自己的数字证书进行相关的各种活动。数字证书由独立的证书发行机构发布。数字证书各不相同,每种证书可提供不同级别的可信度。可以从证书发行机构获得您自己的数字证书。

3.3. 证书格式

目前数字证书的格式普遍采用的是X.509 V3国际标准,内容包括证书序列号、证书持有者名称、证书颁发者名称、证书有效期、公钥、证书颁发者的数字签名等。

数字证书主要由以下两部分组成:

1、证书数据,包括以下内容:

* 版本信息,用来与X.509的将来版本兼容;

* 证书序列号,每一个由CA发行的证书必须有一个惟一的序列号;

* CA所使用的签名算法;

* 发行证书CA的名称;

* 证书的有效期限;

* 证书主题名称;

* 被证明的公钥信息,包括公钥算法、公钥的位字符串表示;

* 包含额外信息的特别扩展。

2、发行证书的CA的数字签名

4. CA认证中心

4.1. 概念

CA中心又称CA机构,即证书授权中心(Certificate Authority ),或称证书授权机构,作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。CA中心为每个使用公开密钥的用户发放一个数字证书,数字证书的作用是证明证书中列出的用户合法拥有证书中列出的公开密钥。CA机构的数字签名使得攻击者不能伪造和篡改证书。在SET交易中,CA不仅对持卡人、商户发放证书,还要对获款的银行、网关发放证书。它负责产生、分配并管理所有参与网上交易的个体所需的数字证书,因此是安全电子交易的核心环节。

4.2. 根证书 

证书是CA认证中心给自己颁发的证书,是信任链的起始点。安装根证书意味着对这个CA认证中心的信任

从技术上讲,证书其实包含三部分,用户的信息,用户的公钥,还有CA中心对该证书里面的信息的签名,要验证一份证书的真伪(即验证CA中心对该证书信息的签名是否有效),需要用CA 中心的公钥验证,而CA中心的公钥存在于对这份证书进行签名的证书内,故需要下载该证书,但使用该证书验证又需先验证该证书本身的真伪,故又要用签发该证书的证书来验证,这样一来就构成一条证书链的关系,这条证书链在哪里终结呢?答案就是根证书,根证书是一份特殊的证书,它的签发者是它本身,下载根证书就表明您对该根证书以下所签发的证书都表示信任,而技术上则是建立起一个验证证书信息的链条,证书的验证追溯至根证书即为结束。所以说用户在使用自己的数字证书之前必须先下载根证书。

5. HTTPS

5.1. 概念

HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

它的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

5.2. HTTPS和HTTP的区别

  • https协议需要到ca申请证书,一般免费证书很少,需要交费。
  • http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
  • http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  • http的连接很简单,是无状态的,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全。

5.3. HTTPS解决的问题

  • 信任主机的问题.
  • 通讯过程中的数据的泄密和被窜改

6. SSL

6.1. 概念

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

为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。

当前版本为3.0。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。

SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可 分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

6.2. SSL协议提供的服务主要有

1)认证用户和服务器,确保数据发送到正确的客户机和服务器;

2)加密数据以防止数据中途被窃取;

3)维护数据的完整性,确保数据在传输过程中不被改变。

6.3. SSL协议的工作流程

服务器认证阶段:1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;4)服务器恢复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。

用户认证阶段:在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。

从SSL 协议所提供的服务及其工作流程可以看出,SSL协议运行的基础是商家对消费者信息保密的承诺,这就有利于商家而不利于消费者。

7. PKI

7.1. 概念

PKI(Public Key Infrastructure)即“公钥基础设施”,是一种遵循既定标准的密钥管理平台,它能够为所有网络应用提供加密和数字签名等密码服务及所必需的密钥和证书管理体系,简单来说,PKI就是利用公钥理论和技术建立的提供安全服务的基础设施。当然,没有好的非对称算法和好的密钥管理就不可能提供完善的安全服务,也就不能叫做PKI。也就是说,该定义中已经隐含了必须具有的密钥管理功能。PKI技术信息安全技术的核心,也是电子商务的关键和基础技术。

PKI的基础技术包括加密、数字签名、数据完整性机制、数字信封、双重数字签名等。

它由公开密钥密码技术、数字证书、证书发放机构(CA)和关于公开密钥的安全策略等基本成分共同组成的。PKI 是利用公钥技术实现电子商务安全的一种体系,是一种基础设施,网络通讯、网上交易是利用它来保证安全的。

8. 密码体制

密码体制分为私用密钥加密技术(对称加密)和公开密钥加密技术(非对称加密)。

8.1. 对称加密算法(对称密钥)

对称密钥加密又叫专用密钥加密,即发送和接收数据的双方必使用相同的密钥对明文进行加密和解密运算。对称密钥加密算法主要包括:DES、3DES、IDEA、FEAL、BLOWFISH等。

8.2. 对称加密算法(公开密钥加密、公钥加密)

对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应 的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称 加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行 加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。

算法:RSA、Elgamal、背包算法、Rabin、HD,ECC(椭圆曲线加密算法)。使用最广泛的是RSA算法,Elgamal是另一种常用的非对称加密算法。

9. X.509

9.1. 简介

数字证书的格式遵循X.509标准。X.509是由国际电信联盟(ITU-T)制定的数字证书标准。

X.509被广泛使用的数字证书标准,是由国际电联电信委员会(ITU-T)为单点登录(SSO-Single Sing-on)和授权管理基础设施(PMI-Privilege Management Infrastructure)制定的PKI标准。X.509定义了(但不仅限于)公钥证书、证书吊销清单、属性证书和证书路径验证算法等证书标准。

9.2. 证书扩展文件名

.cer, .crt – 通常被用于二进制的DER文件格式 (同于.der), 不过也被用于Base64编码的文件 (例如 .pem).

.P7B – 同于 .p7c

.P7C – PKCS#7证书格式,仅仅包含证书和CRL列表信息,没有私钥。

.PFX – 同于 .p12

.P12 – PKCS#12文件, 包含证书(公钥)和私钥(受密码保护),已经完整的证书链信。

PKCS#7 是一种将数据加密和签名(正式名称是“enveloping”)的技术标准。 它描述数字证书的语法和其他加密消息——尤其是,数据加密和数字签名的方法,也包含了算法。但PKCS#7不包含私钥信息。

PKCS#12 定义了一个用于保存私钥和对应公钥证书的文件格式,并由对称密钥加密保护。PKCS#12通常采用PFX,P12作为文件扩展名。 PKCS#12文件可以存放多个证书,并由密码保护,通常用于WINDOWS IIS,也能够被当作Java Keysotre文件使用,用于Tomcat,Resign,Weblogic,Jboss等,不能被用于Apache。

10. 证书管理工具

10.1. keytool工具

keytool是Java中的密钥和数字证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。它还允许用户储存他们的通信对等者的公钥(以证书形式)。

keytool将密钥和证书储存在一个所谓的密钥仓库中。缺省的密钥仓库实现将密钥仓库实现为一个文件。它用口令来保护私钥。

用于数字证书的申请、导入、导出和撤销等操作。

参考资料 :

java keytool 使用总结:http://yushan.javaeye.com/blog/434955

// 删除
keytool -delete -alias tomcatsso -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
keytool -delete -alias tomcatsso -storepass changeit

// 删除
keytool -delete -alias root -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

// 生成私钥
keytool -genkey -keyalg RSA -alias root -dname “cn=192.168.88.75” -storepass changeit -keystore root.keystore

// 导出证书
keytool -export -alias root -file root.crt -storepass changeit -keystore root.keystore

// 导入证书
keytool -import -alias root -file root.crt -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

// 查看
keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit

 

更多参数 ,请在命令行下执行:keytool -help

 

10.2. openssl工具

OpenSSL(http://www.openssl.org/)是一个开放源代码软件包,由Eric A. Young 和Tim J.Hudson等人编写,实现了SSL及相关加密技术,是最常用的证书管理工具。OpenSSL功能远胜于KeyTool,可用于根证书、服务器证书和客户证书的管理。

10.2.1 .openssl 使用说明 (Windows32,笔者下载使用:Win32OpenSSL_Light-1_0_0a.exe)

  1. 环境变量
    设置系统变量OpenSSL_Home,并将其指向OpenSSL的安装目录(C:\OpenSSL)。
    OpenSSL_Home=C:\OpenSSL

    同时,将其执行目录(%OpenSSL_Home%\bin;)加入系统变量Path中。
    Path=%OpenSSL_Home%/bin;%MAVEN_HOME%/bin;%FLEX_HOME%/bin

    2. 工作目录
    打开OpenSSL配置文件openssl.cfg(%OpenSSL_Home%\bin\openssl.cfg),找到配置[CA_default]
    注意变量dir,它指向的是CA工作目录,本文将路径D:/ca作为CA工作目录,对变量dir做相应修改。对于其他变量,我们无需修改。

    建立CA工作目录后,我们需要构建一些子目录,用于存放证书、密钥等。
    1)构建CA子目录
    echo 构建已发行证书存放目录certs
    mkdir certs
    echo 构建新证书存放目录newcerts
    mkdir newcerts
    echo 构建私钥存放目录private
    mkdir private
    echo 构建证书吊销列表存放目录crl
    mkdir crl

    2)构建相关文件
    echo 构建索引文件index.txt
    echo 0>index.txt
    echo 构建序列号文件serial
    echo 01>serial

    3. 构建根证书
    // 在构建根证书前,需要构建随机数文件(.rand)
    openssl rand -out private/.rand 1000

    // 构建根证书私钥(ca.key.pem),这时我们需要输入根证书密码“123456”
    openssl genrsa -aes256 -out private/ca.key.pem 2048

    // 生成根证书签发申请文件(ca.csr),这时我们需要输入根证书密码“123456”
    openssl req -new -key private/ca.key.pem -out private/ca.csr -subj “/C=CN/ST=BJ/L=BJ/O=zlex/OU=zlex/CN=*.zlex.org”

    // 得到根证书签发申请文件后,我们可以将其发送给CA机构签发。当然,我们也可以自行签发根证书。
    // 签发根证书,这时我们需要输入根证书密码“123456”
    openssl x509 -req -days 10000 -sha1 -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certs/ca.cer

    // OpenSSL产生的数字证书不能在Java语言环境中直接使用,需要将其转化为PKCS#12编码格式。
    // 根证书转换,这时我们需要输入根证书密码“123456”
    openssl pkcs12 -export -cacerts -inkey private/ca.key.pem -in certs/ca.cer -out certs/ca.p12

    // 个人信息交换文件(PKCS#12)可以作为密钥库或信任库使用,我们可以通过KeyTool查看该密钥库的详细信息。
    keytool -list -keystore certs/ca.p12 -storetype pkcs12 -v -storepass 123456

    4. 构建服务器证书
    // 服务器证书的构建与根证书构建相似,首先需要构建服务器私钥,这时我们需要输入服务器证书密码“123456”
    openssl genrsa -aes256 -out private/server.key.pem 2048

    // 完成服务器证书密钥构建后,我们需要产生服务器证书签发申请,这时我们需要输入服务器证书密码“123456”
    openssl req -new -key private/server.key.pem -out private/server.csr -subj “/C=CN/ST=BJ/L=BJ/O=zlex/OU=zlex/CN=www.zlex.org”

    // 我们已经获得了根证书,可以使用根证书签发服务器证书
    openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certs/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/server.csr -out certs/server.cer

    // 将OpenSSL产生的数字证书转化为PKCS#12编码格式,这时我们需要输入服务器证书密码“123456”
    openssl pkcs12 -export -clcerts -inkey private/server.key.pem -in certs/server.cer -out certs/server.p12

    现在,我们已经构建了服务器证书(server.cer),并可使用该证书构建基于单向认证的网络交互平台。

    5. 构建客户证书
    // 客户证书的构建与服务器证书构建基本一致,首先需要构建私钥
    // 产生客户私钥,这时我们需要输入客户证书密码“123456”
    openssl genrsa -aes256 -out private/client.key.pem 2048

    // 生成客户证书签发申请,这时我们需要输入客户证书密码“123456”
    openssl req -new -key private/client.key.pem -out private/client.csr -subj “/C=CN/ST=BJ/L=BJ/O=zlex/OU=zlex/CN=zlex”

    // 签发客户证书。如果在第2点配置有问题,有可能报错: I am unable to access the ./demoCA/newcerts directory ./demoCA/newcerts: No such file or directory
    openssl ca -days 3650 -in private/client.csr -out certs/client.cer -cert certs/ca.cer -keyfile private/ca.key.pem

    // 客户证书转换
    openssl pkcs12 -export -inkey private/client.key.pem -in certs/client.cer -out certs/client.p12

 


---转载本站文章请注明作者和出处 996极客教程(996geek.com),请勿用于任何商业用途---

留下评论