微服务是我们部署在处所内或者云基础设施中的组件,微服务可以提供API或者web应用程序。
本章中将介绍Spring Security和Spring Oauth2来实现这些API的安全性;
- 启用安全套接字层(SSL)
- 身份验证和授权
- Oauth2.0
1启用安全套接字层
到目前为止,我们使用的超文本传输协议HTTP,以纯文本的形式传输数据,它方便了黑客的工作,使他们能够使用数据包嗅探器很容易的获取私人信息;
安全套接字层(Secure Socket Layer,SSL)
传输安全层(Transport Security Layer,TSL)
SSL是一种旨在为网络通信提供安全性(加密)的协议。HTTP与SSL结合提供了HTTP的安全性实现,被成为安全超文本传输协议(Hyper Text Transfer Protocol Secure),或通过SSL的超文本传输协议(Hyper Text Transfer Protocol over SSL,HTTPS)。
HTTPS可以确保被交换数据的隐私和完整性得到保护,它还确保被访问网站的真实性。
此安全性围绕着托管应用程序的服务器、最终用户的机器,以及第三方信任存储服务器之间分布签名的数字证书。详细过程如下:
- 最终用户使用web浏览器将请求发送到web应用程序http://test.com
- 在接收到请求之后,服务器使用HTTP代码302讲浏览器重定向到https://test.com
- 最终用户的浏览器链接到https://baidu.com,并且在响应中,服务器把其中包含数字签名的证书提供给最终用户的浏览器;
- 最终,用户的浏览器接收到该证书,并将其发送到受信任的证书颁发机构(Certificate Authority,CA)进行验证;
- 一旦证书获得CA的验证,最终用户的浏览器和应用程序宿主服务器之间就建立了加密的通信;
自签名证书尽可以用于开发和测试的目的。在生产环境中使用这些证书不能提供所需的安全。在生产环境中,要始终使用由受信任的颁发结构出具并签署的证书。安全的存储私钥;
在Tomcat 7.066以上和8.0.28以上的版本中,密钥存储文件可以存储在前面的类路径中,对于较旧的版本,可以使用密钥存储文件的路径作为server:ssl:key-store值;
2.身份验证和授权
身份验证和授权事实上是对Web应用程序提供的。
1.OAuth 2.0
http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
Oauth 1.0依赖于安全证书和通道绑定。Oauth2.0不支持安全认证和通道绑定,它完全工作在传输安全层(Transport Security Layer,TSL)上。因此,Oauth2.0不提供向后兼容;
2.OAuth 2.0规范——简明详细信息
1. OAuth 2.0角色
- 资源所有者
- 客户端
- 资源服务器
- 授权服务器
2. OAuth 2.0客户端注册
与授权服务器通信的客户单首先应该注册到授权服务器才能获取资源的访问键;
3. OAuth 2.0协议端点
Oauth2.0定义了三种类型的端点:
- 授权端点(授权服务器端点)
此端点负责验证资源所有者的身份,并且一旦通过验证,获取授权许可。
- 令牌端点(授权服务器端点)
客户端通过发送授权许可或者刷新令牌调用令牌端点以接受访问令牌。除了饮食许可外的所有授权许可都可使用令牌端点;
- 重定向端点(客户端端点)
一旦资源所有者和授权服务器之间的授权端点的交互完成,授权服务器就使用重定向端点把资源所有者的用户代理重定向回客户端。客户端在注册的时候提供重定向端点,重定向端点必须是绝对URI并且不包含片段组件;
4. OAuth 2.0授权类型
客户端基于从资源所有者获取授权,向授权服务器请求访问令牌。资源所有者以授权许可的方式给出授权。Oauth2.0定义了四种类型的授权许可:
- 授权许可代码
- 隐式许可
- 资源所有者密码凭据许可
- 客户端凭据许可
3.使用Spring Security 的OAuth实现
授权服务器提供两个响应:一个请求——响应是针对验证令牌的,另一请求——相应是针对访问令牌的;
Oauth2.0是保护API的一种方式。Spring Security提供了Spring Cloud Security和Spring Cloud Oauth2.0组件来实现我们许可流程;
步骤如下:
- 在pom.xml中添加Spring Security 和Spring Security Oauth2.0依赖
spring-cloud-starter-security
spring-cloud-starter-oauth2
- 在应用程序类中使用@EnableResourceServer注解,这将允许应用程序可以作为资源服务器工作;
根据Oauth2.0规格,@EnableAuthorizationServer是我们启用授权服务器需要使用的另外一个注解;
- 在application.yml中更新安全服务配置;
server.contextPath:它表示上下文路径
security.user.password:
1.授权码许可
响应返回json格式数据,将这些数据拼接成新的url进行访问
2.隐式许可
返回一个新的url,可以使用该url直接进行访问
3.资源所有者密码凭据许可
需要使用客户端ID和密码来对请求进行身份验证,这些许可流程使用客户端应用程序代替浏览器,并且通常用于移动和桌面应用程序;
一旦客户端收到访问令牌,他就可以用类似于它在授权码许可中的用法来使用;
4.客户端凭据许可
在这种流程中,客户端提供自己的凭据并获取访问令牌。它不使用资源所有者的凭据和权限;