如何为微服务做安全加密? | 微服务系列第十一篇

文章导读

  • 本文仅代表作者的个人观点;
  • 本文的内容仅限于技术探讨,不能作为指导生产环境的素材;
  • 本文素材是红帽公司产品技术和手册;
  • 本文分为系列文章,将会有多篇,初步预计将会有26篇。

一、创建安全的微服务

在微服务架构中实现可靠且强大的安全实现非常重要。微服务的体系结构向应用程序公开了多个入口点,并且通信可能需要多个网络跃点,因此未授权访问的风险很高。这需要比传统应用程序更多的计划。此外,由于REST服务的以下功能,使用REST端点的微服务中的安全性很难实现:

  • REST基于无状态协议(HTTP):必须为每个请求传输在客户端和微服务之间传输的任何敏感信息。
  • REST基于基于文本的协议(HTTP):每个请求发送的信息都可供任何窃听通信的人使用,因为HTTP是纯文本协议。任何敏感数据都是可见的,可能会被第三方捕获。

REST没有定义传输敏感数据的独特标准方法:至少有三种方法可以在REST中以安全的方式传输信息,包括OAuth2,OpenID Connect(OIDC)和JSON Web令牌(JWT)。

为避免互操作性问题和所提到的复杂性,请使用MicroProfile JWT规范来保护在您的微服务之间传递的信息。

该规范使用JSON Web令牌(JWT),这是一种基于令牌的身份验证,它定义了一种算法,以保证在基于REST的应用程序中以可靠和安全的方式传输任何敏感信息。

基于令牌的身份验证工作流涉及以下实体:

Issuer

在声明身份后发出安全令牌。 这通常是一个独特的微服务,作为身份提供者,提供JWT令牌生成器。

Client

从发行者请求令牌的微服务。

Subject

令牌中的信息所指的个人,系统或实体。

Resource Server

消耗令牌的微服务。

资源服务器使用以下令牌工作流:

1 从名为Authorization的字段中的标头中提取安全性令牌。

2 验证令牌检查签名,加密和到期检查。

3 提取有关主题的信息。

4 为主题创建安全上下文。

二、JWT内容完整性

为了避免任何数据操作并确保从发送方到最终目的地的消息的完整性,JWT规范要求JWT数据必须经过签名或加密。

  • 签名:使用私钥来保证内容来自可靠的来源。 签名应符合JSON Web签名(JWS)规范。
  • 加密:使用私钥加密JSON Web加密(JWE)规范之后的内容。

JWT结构

生成的JWT内容使用以下格式进行组织:

xxxxxxxx.yyyyyyyyy.zzzzzzzzz

所有块都使用base64编码进行编码,以使其不易被人们阅读,以避免不需要的用户解析信息。

First Block xxxxxxxx

表示包含用于处理第二个块的信息的JWT标头,例如散列算法和令牌类型,即JWT。

Second Block yyyyyyyyy

表示包含添加到JWT的所有声明的JWT有效内容。 如果邮件已加密,则会对内容进行加密,然后使用base64编码进行编码。

Third Block zzzzzzzzz

表示标头和有效负载的签名,保证在传输过程中没有任何更改。

在下面的示例中,您有一个JWT,三个块中的每一个都用点分隔。

1. JWT头,包含散列算法和base64中编码的令牌类型。

2来自JWT的有效载荷,采用base64编码格式

3标头和有效载荷的签名在base64中编码。

三、在REST端点中传输JWT

需要发送敏感信息的REST端点必须首先向JWT令牌提供程序请求令牌。 在下图中,Microservice A使用JWT微服务提供程序进行身份验证。 验证身份验证后,JWT微服务提供程序返回一个JWT字符串,微服务A可以使用该字符串进行微服务B的身份验证.Microsvice Service A使用Authorization HTTP头字段发送JWT值。 为了被微服务B接受,Authorization头字段必须包含Bearer前缀,后跟JWT字符串。

四、用Java创建JWT

为了与每个服务提供单一功能的微服务架构保持一致,您可以创建一个微服务,为需要利用令牌的所有其他微服务提供JWT。 这种微服务被称为JWT提供商。 Java提供了诸如Auth0,Jose4J和Nimbus JOSE JWT之类的库来创建JWT。 本文使用Nimbus JOSE JWT实现。 在实现JWT生成器之后,生成的字符串用于访问安全的微服务,这将在后面的部分中讨论。 以下示例使用此库创建JWT:

1将声明创建为JSON对象,并使用声明枚举值定义已声明的声明和默认声明。

2实例化签署有效负载的对象。 您必须提供使用ssh-keygen命令创建的私钥,以实例化JWSSigner对象以对声明进行签名。

3将声明解析为JWTClaimsSet对象。

4使用适当的算法实例化JWSHeader对象。

5签署声明和标题:

6创建遵循JWT结构的base64编码内容。

7创建表示JWT结构的String。

四、实验展现:部署JSON Web令牌生成器

检查负责为微服务提供JSON Web令牌(JWT)的REST端点。

首先通过JBDS导入一个已有的maven项目:

通过展开左窗格JBoss Developer Studio中Project Explorer选项卡中的microservice-authz项打开AuthzResource类,然后单击microservice-authz→Java Resources→src / main / java→io.microprofile.showcase.tokens将其展开。 双击AuthzResource.java文件。

检查从端口捕获请求中的用户名和密码的REST端点。 createTokenForCredentials方法使用请求处理的Credentials对象访问用户名和密码。

检查将upn和preferred_username缺省声明添加到HashMap实例的REST端点,稍后将使用该实例生成JWT字符串。 HashMapobject作为参数传递给TokenUtils实用程序类,TokenUtils用于构建令牌字符串。

将自定义声明添加到应用程序使用的JWT字符串。

通过展开JBoss Developer Studio左侧窗格中Project Explorer选项卡中的microservice-authz项打开TokenUtils类,然后单击microservice-authz→Java Resources→src / main / java→io.microprofile.showcase.tokens将其展开。 双击TokenUtils.java文件。

在generateTokenString方法中,将名为dvlpr_nm的新声明添加到jwtContent对象。 使用您的姓名作为来源:

编译运行:

通过http工具发送用户名和密码:

在Headers选项卡中验证状态代码是否为200 OK。

得到token:

原文发布于微信公众号 - 大魏分享(david-share)

原文发表时间:2018-09-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IMWeb前端团队

Nodejs进阶:核心模块https 之 如何优雅的访问12306

本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载 模块概览 这个模块的重要性,基本不用强调了。在网络安全问题日益严峻的今天,...

29310
来自专栏网络

突破封闭 Web 系统的技巧之正面冲锋

在互联网安全服务公司乙方工作的人或者进行 SRC 众测等相关渗透测试时,经常碰到客户只给一个 "xxx信息管理系统"、"xxx平台"之类的一个 Web 登录界面...

25210
来自专栏一体化运维管控平台

HTTPS 证书配置一劳永逸

HTTPS 是在 HTTP 协议基础之上加了一层 SSL/TLS 安全认证机制,原理功能概括一句即客户端和服务端在非对称密钥通讯中交换临时对称密钥进行的加密数据...

1.1K7
来自专栏阮一峰的网络日志

JSON Web Token 入门教程

JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法。

2055
来自专栏LeoXu的博客

一种C/S架构下的 RSA + AES 组合加密方案业务流程

一、初步方案: 1、客户端初始化,调用服务端AES加密key获取接口; 2、服务端从配置文件获取AES加密key,用RSA私钥对其进行加密,返回给客户端; ...

1302
来自专栏mantou大数据

深入浅出JWT(JSON Web Token )

JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑(Compact)且自包含(Self-contained)的方式,用...

63311
来自专栏Linyb极客之路

JSON Web Token 入门教程

JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案,本文介绍它的原理和用法。

1272
来自专栏FreeBuf

直面冥王:最新爆发的C#敲诈木马HadesLocker解读

近日哈勃分析系统捕获到一类由C#语言编写的新的敲诈勒索木马。之前出现 的C#语言编写的木马只是简单地调用了一些C#库来辅助开发。与之相比,这次的变种增加了多层嵌...

2876
来自专栏小樱的经验随笔

记一道明文破解的漫长斗争史

相信很多看过我博客的朋友,都记得我曾经写过 Zip 加密文件破解的文章,如果有没看过的读者朋友们参看这里:https://www.cnblogs.com/ECJ...

2175
来自专栏阮一峰的网络日志

GPG入门教程

前两篇文章,我介绍了RSA算法。 今天,就接着来看,现实中怎么使用这个算法,对信息加密和解密。这要用到GnuPG软件(简称GPG),它是目前最流行、最好用的加密...

3827

扫码关注云+社区

领取腾讯云代金券