IdentityServer4之JWT签名(RSA加密证书)及验签

2023-05-16

一、前言


 在IdentityServer4中有两种令牌,一个是JWT和Reference Token,在IDS4中默认用的是JWT,那么这两者有什么区别呢?

 

二、JWT与Reference Token的区别


 1、JWT(不可撤回)  

  JWT是一个非常轻巧的规范,一般被用来在身份提供者和服务提供者间传递安全可靠的信息。JWT令牌是一个自包含的访问令牌 - 它是一个带有声明和过期的受保护数据结构。一旦API了解了密钥材料,它就可以验证自包含的令牌,而无需与发行者进行通信。这使得JWT难以撤销。它们将一直有效,直到它们过期。

  JWT常被用于前后端分离,可以和 Restful API 配合使用,常用于构建身份认证机制,一个 JWT 实际上就是一个字符串,它包含了使用.分隔的三部分: Header 头部 Payload 负载 Signature 签名(格式:Header.Payload.Signature)

在这个三个部分中最关键的就是signature。

  signature:被用来确认JWT信息的发送者是谁,并保证信息没有被篡改,使用header中指定的算法将编码后的header、编码后的payload、一个secret进行加密。因此签名算法推荐使用RSA或ECDSA非对称加密算法。

JWT特点:

  A、JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。

  B、为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输

  C、jwt去中心化的思想:api资源收到第一个请求之后,会去id4服务器获取公钥,然后用公钥验证token是否合法,如果合法进行后面的有效性验证。有且只有第一个请求才会去id4服务器请求公钥,后面的请求都会用第一次请求的公钥来验证,这也是jwt去中心化验证的思想。(注:如果签名证书发生改变则需要重启有请求ids4服务器的资源服务器。)

  D、JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证。

 

2、Reference Token(不携带任何用户数据,可撤回)

  当使用 Reference token 的时候,服务端会对 Token 进行持久化,当客户端请求资源端(API)的时候,资源端需要每次都去服务端通信去验证 Token 的合法性[/connect/introspect],IdentityServer4.AccessTokenValidation 中间件中可以配置缓存一定的时候去验证,并且 Token 是支持撤销[/connect/revocation]的。

  使用引用令牌时 - IdentityServer会将令牌的内容存储在数据存储中,并且只会将此令牌的唯一标识符发回给客户端。接收此引用的API必须打开与IdentityServer的反向通道通信以验证令牌。如下:access_token就是唯一标识。(注不携带任何数据)

 

   当 AccessTokenType 定义为 Reference 的时候,验证资源端要注意配置 ApiSecrets 以确保 POST /connect/introspect HTTP/1.1 接口能验证通过,当 AccessTokenType 定义为 Jwt 的时候则资源端可不配置 options.ApiSecret 选项。如下图:

 

Reference Token官方图如下:

 以上就是JWT与Reference token的区别。为了减少访问中心服务器的资源,使用JWT还是非常棒的,毕竟与服务器交互的资源还是非常的昂贵的。不过具体的还得视实际情况而定。

那么我们来看一下在IDS4中API使用JWT以及Reference Token的交互流程图

 

三、IDS4中API使用JWT以及Reference Token与认证中心的交互流程图


此图为:JWT,当然大家可以通过fiddler 抓包工具来查看一下具体的数据流就能明白其中的道理。

注:资源服务器在第一次解析AccessToken的时候会先到授权服务器获取配置数据(例如会访问:http://localhost:5000/.well-known/openid-configuration 获取配置的,http://localhost:5000/.well-known/openid-configuration/jwks 获取jwks)),之后解析AccessToken都会使用第一次获取到的配置数据,因此如果授权服务的配置更改了(加密证书等等修改了),那么应该重启资源服务器使之重新获取新的配置数据;

 

 此图为:Reference Token

 以上即JWT与Reference Token 流程图。

四、JWT中使用RSA加密


在说明JWT使用RSA加密之前我们先来比较一下其他的加密算法

1、HS256与RS256的区别

  HS256 使用密钥生成固定的签名,RS256 使用成非对称进行签名。简单地说,HS256 必须与任何想要验证 JWT的 客户端或 API 共享秘密。即 如下图

 

  RS256 生成非对称签名,这意味着必须使用私钥来签签名 JWT,并且必须使用对应的公钥来验证签名。与对称算法不同,使用 RS256 可以保证服务端是 JWT 的签名者,因为服务端是唯一拥有私钥的一方。这样做将不再需要在许多应用程序之间共享私钥


2、创建自签名证书(操作步骤)

  生产环境(负载集群)一般需要使用固定的证书签名与验签,以确保重启服务端或负载的时候 Token 都能验签通过。(不使用临时证书)

那么证书如何生成请看下面分解步骤:

  第一种:使用OpenSSL生成证书,注:RSA加密证书长度要2048以上,否则服务运行会抛异常


#Linux系统生成证书:(推荐使用)
sudo yum install openssl (CentOS)
#生成私钥文件 openssl genrsa
-out idsrv4.key 2048

#创建证书签名请求文件 CSR(Certificate Signing Request),用于提交给证书颁发机构(即 Certification Authority (CA))即对证书签名,申请一个数字证书。 openssl req -new -key idsrv4.key -out idsrv4.csr
#生成自签名证书(证书颁发机构(CA)签名后的证书,因为自己做测试那么证书的申请机构和颁发机构都是自己,crt 证书包含持有人的信息,持有人的公钥,以及签署者的签名等信息。当用户安装了证书之后,便意味着信任了这份证书,同时拥有了其中的公钥。) openssl x509
-req -days 365 -in idsrv4.csr -signkey idsrv4.key -out idsrv4.crt (包含公钥)
#自签名证书与私匙合并成一个文件(注:.pfx中可以加密码保护,所以相对安全些) openssl pkcs12
-export -in idsrv4.crt -inkey idsrv4.key -out idsrv4.pfx (注:在生成的过程中会让我们输入Export Password)

 

 证书截图如下:

 

  第二种:


openssl req -newkey rsa:2048 -nodes -keyout idsrv4.key -x509 -days 365 -out idsrv4.cer
openssl pkcs12 -export -in idsrv4.cer -inkey idsrv4.key -out idsrv4.pfx  

 

生成如下:

 

3、证书生成之后就可进入VS2017中配置

拷贝生成的证书,放到认证/授权服务器项目中。(VS中配置文件设置文件始终复制),最后把证书路径和密码配置到 IdentityServer 中,因为我们自签名的证书是 PKCS12 (个人数字证书标准,Public Key Cryptography Standards #12) 标准包含私钥与公钥)标准,包含了公钥和私钥。

 A、在appsetting.json 配置文件中添加如下:此处需要配置password,自定义即可。

 

B、在starup.cs中ConfigureServices方法中配置如下即可。

 

配置完后即可。我们启动IDS4项目即可生成加密的token。

 

将得到的token在jwt.io 网站来认证一下:把后缀为 crt 公钥、key私钥复制到验证中,发现认证ok。这样即可实现防篡改。

 

 

五、总结


在实际环境中应该使用加密的token,而不应该使用临时令牌。以及尽量设置token的过期时间短,以及刷新token的机制,这样可以尽可能的保护token以及数据安全。

 

asp.net core 交流群:787464275 欢迎加群交流
如果您认为这篇文章还不错或者有所收获,您可以点击右下角的【推荐】按钮精神支持,因为这种支持是我继续写作,分享的最大动力!

作者:LouieGuo
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!

微信公众号:欢迎关注                                                 QQ技术交流群: 欢迎加群

                

LouieGuo
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IdentityServer4之JWT签名(RSA加密证书)及验签 的相关文章

  • python中Tuple详解

    python中Tuple详解 另外 还有一个和list 很像的数据tuple 中文叫元组 他和list的主要区别就是 tuple是一开始就定义好的 即 assign first 之后就永远不能被改变了 所以 一般全局比较重要的数据 我们都是
  • 自动分析局域网内网速慢的电脑---结合IPERF,TASK SCHEDULE,PYTHON,MAIL

    今天写的 用IPERF作测试局域网速度的工具 用AD域组策略推送给客户端 xff0c xcopy y XXX XXX Iperf c Iperf 然后 xff0c 客户端会在每次LOGON的执行测试网速的BAT文件 xff0c 并将结果存放
  • 对IIC总线时序的一点理解以及ACK和NACK(NAK)

    参考自 xff1a http blog chinaunix net uid 16100003 id 3059814 html 关于IIC的响应问题 xff1a 对于每一个接收设备 xff08 从设备 xff0c slaver xff09 x
  • Permutation test(排列(组合)检验)

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 对Permutation test 的首次描述可追溯到上个世纪30年代 Fisher 1935 和Pitman 1937 介绍了其在线性统计模型中的应用 但该法计算工作量过
  • windows全局变量设置

    今天安装jave RE xff0c 需要设置全局变量 xff0c 除了图形界面的配置外 xff0c 有没有其他的方式设置呢 xff0c 开始以为set可以 xff0c 看了半天没整明白到网上search下 xff0c 见到了几种方法 xff
  • ProxmoxVE 单机模式安装(2台服务器非集群)

    上面左边是我的个人微信 xff0c 如需进一步沟通 xff0c 请加微信 右边是我的公众号 Openstack私有云 xff0c 如有兴趣 xff0c 请关注 公司有两台测试服务器 xff0c 是华为的RH2288 V3 xff0c 配置6
  • Desktop.ini

    类型1 ShellClassInfo IconFile 61 abc exe abc ico IconIndex 61 0 类型2 ShellClassInfo IconResource 61 abc exe abc ico 0 类型2 的
  • linux下安装ntop

    Ntop是一种监控网络流量工具 xff0c 用ntop显示网络的使用情况比其他一些网络管理软件更加直观 详细 Ntop甚至可以列出每个节点计算机的网络带宽利用率 他是一个灵活的 功能齐全的 xff0c 用来监控和解决局域网问题的工具 xff
  • iOS学习24之UIControl及其子类

    1 UIControl初识 1 gt 概述 UIControl 是有控制功能 的视图 如UIButton UISlider UISegmentedControl等 的父类 只要跟控制有关的控件 都是继承于该类 UIControl 这个类通常
  • URL中“#” “?” &“”号的作用

    1 10年9月 xff0c twitter改版 一个显著变化 xff0c 就是URL加入了 34 34 符号 比如 xff0c 改版前的用户主页网址为http twitter com username改版后 xff0c 就变成了http t
  • 强化路由器IOS安全-禁用不必要的服务

    Cisco Discovery Protocol CDP xff1a 思科发现协议 xff08 CDP xff1a Cisco Discovery Protocol xff09 CDP 基本上是用来获取直连设备的协议地址以及发现这些设备的平
  • 【OCR技术系列之三】大批量生成文字训练集

    放假了 xff0c 终于可以继续可以静下心写一写OCR方面的东西 上次谈到文字的切割 xff0c 今天打算总结一下我们怎么得到用于训练的文字数据集 如果是想训练一个手写体识别的模型 xff0c 用一些前人收集好的手写文字集就好了 xff0c
  • ubuntu安装mysql报错_在Ubuntu上安装mysql数据库和遇到的问题

    如果上面没有成功 xff0c 而出现了这样的问题的话 xff1a Mysql ERROR 1045 28000 Access denied for user 39 root 39 64 39 localhost 39 using passw
  • debian wheezy 使用

    为什么80 的码农都做不了架构师 xff1f gt gt gt 准备 xff1a 1 启动盘制作 软件 xff1a windows下lililinuxusbcreator linux下unetbootin debian 7 0 iso mi
  • Debian 7 安装 Wireshark

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 安装Wireshark sudo apt get install wireshark 如果以非root权限运行wireshark xff0c 可能会出现 No inte
  • win7桌面仿linux桌面,windows10开启 linux子系统桌面,巨详细,值得一藏-win7桌面主题...

    题记 xff1a 安装完微软windows10的ubuntu子系统之后 xff0c 想打开这款子系统的桌面 xff0c 一直摸不着头脑 找了很多教程 xff0c 都有点凌乱 xff0c 在此整理一下 0 备份原 get源文件 sudo mv
  • 石器时代地图->魔力宝贝地图

  • proxmox集群节点崩溃处理

    问题描述 在现有集群加入一个物理节点 xff0c 接着再此节点创建ceph监视器 创建OSD 从宿主机系统执行ceph osd tree查看状态 xff0c 创建起来的几个OSD状态都正常 xff08 up xff09 xff0c 从pro
  • debian笔记本电源管理

    kde下面使用kpowersave工具 xff0c 实现suspend和hibernate还需要pm ultis包 此时可以通过root权限pm suspend和pm hibernate实现to ram和to disk 普通用户用kpowe
  • 发挥Squid优势,TCP_HIT变成TCP_MEM_HIT

    192 168 10 139 15 Dec 2011 16 49 37 43 0800 34 GET http www jian com p w picpaths shufa jpg HTTP 1 0 34 200 95900 34 34

随机推荐

  • linux默认有回收站吗,linux下默认删除文件到回收站(bash实现)

    fedora下总是会把文件不小心删除了 xff0c 所以下面的脚本把实现 xff1a 文件删除默认移动到自己的回收站里面 功能 xff1a 脚本实现删除文件或者目录到 waste 自己定义 脚本附带文件名或者目录名 xff0c 则默认代表
  • EXCEL复制死机的问题

    最近发现好几例excel复制死机的现象 xff0c 特总结了一下解决方法 基本上就是下面几种 xff1a 可以供大家参考 1 剪贴板的问题 xff0c 与迅雷等监视剪贴板的软件相关 打开 配置 监视 监视剪贴板 xff0c 取消这个勾选 x
  • Transport endpoint is not connected 报错

    在android中做在线升级程序 xff0c 在http请求数据时 xff0c 出现如下错误 xff1a java net SocketTimeoutException Transport endpoint is not connected
  • Ubuntu下Qt自动退出

    一直在使用Qt xff0c 真的被它强大的功能 漂亮的界面深深吸引了 不过最近遇到了一件非常让人不爽的事情 xff0c 就是在Qt下创建文件的时候会自动 xff0c 而且没有代码提示功能 想想吧 xff0c 这是多么令人头痛 xff0c 没
  • 洛谷 P1233 【木棍加工】题解

    算法 xff1a 排序 xff0c DP xff08 最长上升子序列 xff09 前言 xff1a 此题的数据非常水 xff0c 这里给予一组 hack 数据 xff1a 21 96 25 1 9 39 19 87 51 7 61 11 1
  • C# 修改电脑DNS和IP方法

    lt summary gt 将IP xff0c DNS设置为自动获取 lt summary gt private void setDHCP string doscmd 61 34 netsh interface ip set address
  • 使用Java实现串口通信(二)

    1 写在前面 距离上一篇文章 使用Java实现串口通信 已经过去快两年的时间了 xff0c 在此期间收到了很多读者的反馈 xff0c 很高兴可以帮助到这么多人 xff0c 根据收到的反馈 xff0c 我对代码逻辑进行了优化整理 xff0c
  • MSMG ToolKit v11.2 DL

    友情提醒一下 xff0c 建议使用原版 精简操作系统要是被后门 看不懂英文的可以百度翻译 xff0c 时间久了就明白嘛意思了 无非就那几个单词 如真要使用汉化版 xff0c 优化版的 看好你的核心bin文件夹 MSMG ToolKit By
  • Flutter之使用overlay显示悬浮控件

    Overlay与OverlayEntry Overlay是一个Stack的widget xff0c 可以将overlay entry插入到overlay中 xff0c 使独立的child窗口悬浮于其他widget之上 因为Overlay本身
  • 七夕快到了!表白小程序制作详解,撩翻你的女神!

    大家可能都会在抖音上刷过 xff0c 那种表白小程序 xff0c 但在我看来表白还是亲口说出来比较好 xff0c 这类小程序只适合在平常的一些小节日给对方一个惊喜 话不多说 xff0c 现在进入正题 xff1a 首先 xff0c 要在电脑上
  • Android Studio更改项目SDK的版本

    Elipse 中的安卓项目 xff0c 在Android Studio中可以通过File gt new gt Import Project的方法建立起来 但是有时候需要用到更改项目的API Level xff0c 下面的操作步骤为更改方法
  • java使用POI操作XWPFDocument 生成Word实战(一)【比较详细的】

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 注 xff1a 我使用的word 2016 功能简介 xff1a xff08 1 xff09 使用jsoup解析html得到我用来生成word的文本 xff08 这个你们可
  • HTML加载本地图片

    lt DOCTYPE html gt lt html gt lt body gt lt img src 61 34 file C Users Administrator Desktop 1 jpg 34 gt lt body gt lt h
  • navicat mysql 连接本地 忘记密码 查看密码 操作

    https jingyan baidu com article 454316ab4e9e65f7a7c03ad1 html 转载于 https www cnblogs com yzw23333 p 9510990 html
  • 巧用“记事本” 让病毒白白运行

    电脑中毒后 xff0c 许多朋友会打开 进程管理器 xff0c 将几个不太熟悉的程序关闭掉 xff0c 但有时会碰到这种情况 xff1a 关掉一个 xff0c 再去关闭另外一个时 xff0c 刚才关闭的那个马上又运行了 再从注册表里先把启动
  • mmap如何使用?

    蓝森林 http www lslnet com 2006年4月24日 18 41 对Linux内核内存管理搞了好久了 xff0c 其中对于mmap如何使用 xff0c 有很长一段时间存在疑惑 xff0c 后来在看Linux进程间通信机制的时
  • Sliding Window Maximum

    Given an array nums there is a sliding window of size k which is moving from the very left of the array to the very righ
  • 项目供参考Asp.net C# 获取本周上周本月上月本年上年第一天最后一天时间大全...

    查了好多资料 xff0c 发现还是不全 xff0c 干脆自己整理吧 xff0c 至少保证在我的做法正确的 xff0c 以免误导读者 xff0c 也是给自己做个记录吧 xff01 项目顶用到了 xff0c 所以就写全了 xff0c 供参考使用
  • 彻底关闭 Win10安全中心提示

    del reg Windows Registry Editor Version 5 00 HKEY LOCAL MACHINE SOFTWARE Microsoft Windows CurrentVersion Explorer Shell
  • IdentityServer4之JWT签名(RSA加密证书)及验签

    一 前言 在IdentityServer4中有两种令牌 xff0c 一个是JWT和Reference Token xff0c 在IDS4中默认用的是JWT xff0c 那么这两者有什么区别呢 xff1f 二 JWT与Reference To