首页 > 技术文章 > SSO单点登录

nicholasgub 2021-09-12 19:10 原文

多集群存在RPC调用时存在的问题

在一个庞大的系统设计里面,用户的登陆将成为一个难点,不可能在用户登录到web端时实现了登录,当用户为完成某一操作调用RPC端执行的时候再进行一次RPC端的登录。

单点登录

SSO(Single Sing On、单点登录)是在多个应用系统中,用户只需要登陆一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登陆的机制,是目前比较流行的企业业务整合的解决方案之一。

在SSO的处理过程中为了保证单点登陆的安全性需要使用https访问以及证书的签发。

Https协议

  • HTTP(Hypertext transfer protocal)是一种详细规定了浏览器和万维网服务器之间相互通信的规则,通过因特网传送万维网文档的数据传送协议。
  • HTTPS(Hypertext transfer protocal over Secure Socket Layer)是以安全为目标的http通道,https的安全基础是ssl,因此加密的详细内容就需要ssl。https协议需要到ca申请证书(一般免费的证书很少)。
  • http是超文本传输协议,信息是明文传输的,https则是具有安全性的ssl加密传输协议,http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

    超文本传输安全协议(Https,也被称作HTTP over TLS, HTTP over SSL或者HTTP Secure)是一种网络安全的传输协议,SSL(Secure Socket Layer,安全套接字层),TLS(Transport Layer Security,传输层安全协议),HTTPS开发的主要目的,是提供对网络服务器的认证,保证交换信息的机密性和完整性。

    SSL是位于可靠的面向连接的网络层协议和应用层协议之间的一种协议。SSL通过相互认证、使用数字签名保证完整性、使用加密确私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL加密协议和SSL握手协议。SSL的核心概念:加密算法,数字证书,CA。
    TLS用于确保两个通用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议(TLS是传输层加密协议,它的前身是SSL协议,如果没有特殊要求,可以简单理解为TLS和SSL都属于同一协议)。

TLS、SSL加密算法

加密算法严格来说属于编码学(密码编码学),编码是信息从一种形式或格式转换为另一种形式的过程,解码是编码的逆过程(对应密码学中的解密)。加密算法主要分为两类,对称加密算法和非对称加密算法。

  • 在对称加密算法中,使用的密钥只有一个,发收信双方都使用这一个密钥进行加密和解密,这就要求解密方事先知道加密密钥。
  • 非对称加密算法需要两个密钥,公开密钥和私有密钥,公开密钥与私有密钥是一对,如果用公开密钥进行数据加密,只有用对应的私有密钥才能解密,服务器端发送加密锁给客户端,公开密钥需要定期更换。
  • 身份认证是建立每一个TLS连接不可或缺的部分,比如你有可能跟任何一方建立一个加密的通道,包括攻击者,除非我们确保通信的,在开始加密通道之前。服务端是我们可以信任的,否则所有的加密(保密)工作都没有任何作用,而身份认证的方式就是通过证书以数字方式签名的声明,它将公钥与持有相应私钥的主体(个人、设备或服务)身份绑定在一起,通过在证书上签名,CA可以核实与证书上公钥相对应的私钥为证书所指定的主体所拥有。客户端和服务器首先必须建立连接和交换参数,这个过程叫握手。

OpenSSL签发证书

OpenSSL是为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其他目的使用。通过在一定范围内部署一台CA(Certificate Authority)服务器,可以实现局域网内的证书认证和授权,保证数据传输的安全性,也可以通过具体的部署实践,了解国际上大型CA机构的工作原理,为企业级的证书管理提供知识积累。

使用centos7签发证书流程如下:

  • 签发CA根证书
1.生成CA密钥对(密钥对长度2048字节)
openssl genrsa -out /usr/local/srv/ftp/cas/cakey.pem 2048 RSA
2.生成根证书签发申请(证书访问时已域名出现)
openssl req -new -key /usr/local/srv/ftp/cas/cakey.pem -out /usr/local/srv/ftp/cas/cacert.csr -subj /CN=cas.com
3.根证书签发
openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey /usr/local/srv/ftp/cas/cakey.pem -in /usr/local/srv/ftp/cas/cacert.csr -out /usr/local/srv/ftp/cas/ca.cer
  • 签发服务器证书
1.生成服务器私钥
openssl genrsa -aes256 -out /usr/local/srv/ftp/cas/server/server-key.pem 2048
2.生成服务器证书签发申请
openssl req -new -key /usr/local/srv/ftp/cas/server/server-key.pem -out /usr/local/srv/ftp/cas/server/server.csr -subj /CN=cas.com
3.生成服务器证书
openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA /usr/local/srv/ftp/cas/ca.cer -CAkey /usr/local/srv/ftp/cas/cakey.pem -CAserial /usr/local/srv/ftp/cas/server/ca.srl -CAcreateserial -in /usr/local/srv/ftp/cas/server/server.csr -out /usr/local/srv/ftp/cas/server/server.cer
  • 签发客户端证书
1.生成客户端私钥
openssl genrsa -aes256 -out /usr/local/srv/ftp/cas/client/client-key.pem 2048
2.生成客户端证书申请
openssl req -new -key /usr/local/srv/ftp/cas/client/client-key.pem -out /usr/local/srv/ftp/cas/client/client.csr -subj /CN=cas.com
3.生成客户端签发证书
openssl x509 -req -days 365 -sha1 -CA /usr/local/srv/ftp/cas/ca.cer -CAkey /usr/local/srv/ftp/cas/cakey.pem -CAserial /usr/local/srv/ftp/cas/server/ca.srl -in /usr/local/srv/ftp/cas/client/client.csr -out /usr/local/srv/ftp/cas/client/client.cer
  • 生成Java证书(证书转换)
1.生成客户端证书
openssl pkcs12 -export -clcerts -name cas-client -inkey /usr/local/srv/ftp/cas/client/client-key.pem -in /usr/local/srv/ftp/cas/client/client.cer -out /usr/local/srv/ftp/cas/client/client.p12
2.生成服务器证书
openssl pkcs12 -export -clcerts -name cas-server -inkey /usr/local/srv/ftp/cas/server/server-key.pem -in /usr/local/srv/ftp/cas/server/server.cer -out /usr/local/srv/ftp/cas/server/server.p12
3.服务器证书导入本机受信任证书
keytool -importcert -trustcacerts -alias cas.com -file /usr/local/srv/ftp/cas/ca.cer -keystore /usr/local/tomcat/ca-trust.p12
4.查看所有证书信息
keytool -list -keystore /usr/local/srv/ftp/cas/client/client.p12 -storetype pkcs12 -v

tomcat配置单向认证

所谓的单向认证指的是在服务器端提供有一个公共的证书,所有的客户端连接之后都可以获得这个公钥,加密后,服务器端可以利用私钥进行解密处理。
修改tomcat配置文件server.xml:

推荐阅读