IdentityServer4:发布环境的数字签名证书
一,jwt的三个组成部件
先来看一个由IdentityServer颁发的一个标准令牌
eyJhbGciOiJSUzI1NiIsImtpZCI6IjBiNTE3ZjIzYWY0OGM4ZjkyZjExMzM5MDMwZTI5NDkwIiwidHlwIjoiSldUIn0.
eyJuYmYiOjE1Njk4MDUxNzgsImV4cCI6MTU2OTgwNTQ3OCwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjoiYXBpQ2xpZW50SHlicmlkIiwibm9uY2UiOiI2MzcwNTQwMTk
2OTg5ODM3MjAuTnpZM016RTFObVF0WXpBMFlpMDBNR1k1TFdGbE1qY3RORGc0WldJMVl6RmpOemMzWW1Sa05URXdabUV0T1RKbU9DMDBZemRsTFdFNE16TXRaV0l6T0dabE5tWmlOamRoIi
wiaWF0IjoxNTY5ODA1MTc4LCJhdF9oYXNoIjoiMzRmemR5QzJmWFNCN3QzYl9mOW1VUSIsInNpZCI6IjIyOWU0OWRmOTZkY2U0OTVjMjZkMzI4MDhjMDM3MTk3Iiwic3ViIjoiMCIsImF1d
GhfdGltZSI6MTU2OTgwNTE3NSwiaWRwIjoibG9jYWwiLCJuYW1lIjoiYXBpVXNlciIsInBob25lbW9kZWwiOiJodWF3ZWkiLCJhbXIiOlsicHdkIl19.
rjksvMQkguG6qgQed7NZumdtcyDiEBuy9pDpEB-DOCGjqHF8BwI9CAWEOEbdb6PI9qBdFaZdafREZSodoL8qZMbd5ss2yrt01jhCaT00V54_ySFfyaBwpy8PFlasdygQEgEF44ZMLkaMWuV
u_dV22wkE1y5TCsPj-5hM7CpLiDDwaQvEVMe8FEZbJAZ8wskvnAFLY7P37LzjjPDWXW3hB10e-teNel2yXzsnlwpebQnLwUD46tKwAt4XDJ7yYqkuQ1y_dVvqJYf2awEeZPSn7tzThTaz5H
PCNvPwiO_9w7O1nb9gk-t97DR9uOC1Iz5fFHPuRjI7Gcm5dm3dgmgBfg
这个令牌用符号“.”把其分成了三个部份:
1,头部:一个经过Base64编码的JSON字符串

"alg"字段表示了这个令牌的签名加密方式,上面我们用的是RSA256非对称加密,"type"则表示这是一个JWT格式令牌。“kid”是由令牌颁发者自由定义的一个值,用处不一,可以用来表示一个消息序号,但更多用来加大签名的复杂度。比如一个字符串用md5加密,如果这个字符串很简单,有规律,那么很容易被人破解,但用一定的算法加工后,比如字符串前后加上一组密钥,那么被破解的难度就很大了,但这个加工算法不要被人容易猜到,因为kid值是任何人都可以看到的。
2,消息主体:payload,也是一个经过Base64编码的JSON字符串,包含令牌Claim,也是利用令牌获取信息的主要部分。

3,签名字符串。
令牌一旦颁发,前面两个部分的内容是任何人可见的,没有任何的安全措施。那么如何保证令牌不被人篡改和伪造呢?就是通过由签名算法生成的一个签名字符串。
IdentityServer4的签名算法使用RSA加密算法,RSA是一个非对称加密算法,用私钥来加密,用公钥来解密。私钥只保存在IdentityServer端,而公钥可以公布出去,IdentityServer是通过公开一个URL:http://localhost:5000/.well-known/openid-configuration/jwks发布公钥。这里就要注意一个问题,由于公钥是公开的,那么私钥就要保护好了,如果私钥被泄露就很容易被人篡改和伪造令牌。IdentityServer4为了保护私钥安全,分开了开发环境和发布环境的密钥加载。IdentityServer4公开了两个方法AddSigningCredential和AddDeveloperSigningCredential,分别用于开发环境和发布环境加载密钥。AddDeveloperSigningCredential会创建一个临时密钥供调试环境用。实际应用时开发环境的密钥证书可以直接放在服务器上,项目发布到服务器后通过配置文件指向这个密钥。
二,利用Openssl创建密钥证书。
从https://www.openssl.org/下载openssl安装包并安装,打开命令行,输入openssl,如果提示Openssl不是内部或外部命令,需要设置一下环境变量,把Openssl的安装目录加入到path环境变量。

另外新建一个环境变量,如以下所示,名称为:OPENSSL_CONF,指向你安装目录的openssl.cfg文件,现在输入openssl应该没有问题了。

新建一个文件夹用于放置密钥,在该目录打开命令行。
1,申请一个私钥,在命令行中输入:openssl genrsa -out private_ids.key 2048。申请一个2048位的RSA加密私钥。目录下将多了一个名为private_ids.key的文件。
2,申请一个公钥,openssl req -new -x509 -key private_ids.key -days 3650 -out public_ids.crt。其中 -key private_ids.key是指定这个公钥的配对私钥,就是第一步申请的私钥。x509是X.509公钥格式标准。
接下来会提示你输入一些信息,用于颁发机构的信息展示,如公司,所在国家,城市等
PS E:\ssl\tch> openssl req -new -x509 -key private_ids.key -days 3650 -out public_ids.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:GUANGDONG
Locality Name (eg, city) []:DONGGUANG
Organization Name (eg, company) [Internet Widgits Pty Ltd]:KINGSUN
Organizational Unit Name (eg, section) []:KINGSUN-IN
Common Name (e.g. server FQDN or YOUR name) []:LIUJB
Email Address []:LIUJB114@163.COM
PS E:\ssl\tch>
如果不想每次都输入这些信息,可以使用“-config 配置文件目录”的方式指定配置文件,安装后Openssl后,有一个名为openssl.cnf的默认的配置文件在安装目录bin/cnf目录中。编辑该文件,找到req_distinguished_name
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = AU
countryName_min = 2
countryName_max = 2 stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Some-State localityName = Locality Name (eg, city) 0.organizationName = Organization Name (eg, company)
0.organizationName_default = Internet Widgits Pty Ltd # we can do this but it is not needed normally :-)
#1.organizationName = Second Organization Name (eg, company)
#1.organizationName_default = World Wide Web Pty Ltd organizationalUnitName = Organizational Unit Name (eg, section)
#organizationalUnitName_default = commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_max = 64 emailAddress = Email Address
emailAddress_max = 64
这里可以指定这些参数的默认值,如指定国家默认值为CN。把countryName_default改成CN就行了。申请完公钥后,目录下将多了一个public_ids.crt的文件。
3,公钥及私钥的提取加密。由于传播安全方面的考虑,需要将公钥及私钥加密,微软支持PCK12(公钥加密技术12号标准:Public Key Cryptography Standards #12),PCK12将公钥和私钥合在一个PFX后缀文件并用密码保护,如要提取公钥和私钥需要密码确认。另一种觉的公钥私钥提取加密方式是JKS(JAVA Key Store)用于JAVA环境的公钥和私钥提取。这两种格式可以相互转换。
在命令行中输入
openssl pkcs12 -export -in public_ids.crt -inkey private_ids.key -out ids.pfx
输入密码和确认密码后,当前目录会多出一个文件:ids.pfx。这就是我们要用的密钥证书了。
三,使用密钥
将第二步生成ids.pfx文件复制服务器发布目录,如果只是为了测试,可以复制到本地项目目录。将目录信息及证书提取密码存入配置文件
"Certificates": {
"CertPath": "Certificates/idsrv4.pfx",
"Password": "123456"
}
就可以使用该配置信息为开发环境加载密钥证书了
if (Environment.IsDevelopment())
{
builder.AddDeveloperSigningCredential();
}
else
{
builder.AddSigningCredential(new X509Certificate2(Path.Combine(Environment.ContentRootPath,
Configuration["Certificates:CertPath"]),
Configuration["Certificates:Password"]));
}
如果想调试环境也统一证书,可以把环境判断去掉,只用AddSigningCredential方式加载密钥证书。


IdentityServer4:发布环境的数字签名证书的更多相关文章
- Activex打包于发布完整版---微软证书制作
众所周知,Activex组件没有进行有效的签名,在IE上无法安装的,除非你让用户手工开启“接收任何未签名的ActiveX”,这个很明显不现实.而组件签名需要证书,证书从哪里来,你可以选择付1000到3 ...
- windows下如何制作和应用数字签名证书 全流程
目前我们在发布应用程序时,有时用户下载后会被360杀毒当做木马直接隔离.为应用程序可执行文件打上数字签名可以让360杀毒放宽检测规则.下文是讲述如何制作数字签名证书的过程. 需要准备的工具:makec ...
- C# 获取PDF中的数字签名证书
PDF中的加数字签名是对文档权威性的有效证明.我们在向PDF文档添加签名时,需要准备可信任的签名证书.同时,对已有的签名,可验证签名是否有效,也可以获取文档中的签名证书信息.下面,以C#代码示例展示如 ...
- 非域环境下使用证书部署数据库(SqlServer2008R2)镜像
非域环境下使用证书部署数据库(SqlServer2008R2)镜像 前言 部署数据库镜像一般有两种方式域环境下部署http://liulike.blog.51cto.com/1355103/33918 ...
- vue config.js配置生产环境和发布环境不同的接口地址问题
第一步,分别设置不同的接口地址 首先,我们分别找到下面的文件: /config/dev.env.js /config/prod.env.js 其实,这两个文件就是针对生产环境和发布环境设置不同参数的文 ...
- VUE 利用webpack 给生产环境和发布环境配置不同的接口地址
第一步,分别设置不同的接口地址 首先,我们分别找到下面的文件: /config/dev.env.js /config/prod.env.js 其实,这两个文件就是针对生产环境和发布环境设置不同参数的文 ...
- webpack 实现自动刷新,复制文件,实现开发环境和发布环境
webpack例子:https://github.com/Aquarius1993/webpackDemo 安装: webpack , webpack-dev-server 1.如何在使用webpac ...
- VUE 利用 webpack 给生产环境和发布环境配置不同的接口地址
转载地址: https://blog.csdn.net/gebitan505/article/details/58166055 VUE 利用 webpack 给生产环境和发布环境配置不同的接口地址 前 ...
- nuxtjs如何部署cdn及区分发布环境
1.部署cdn nuxt build 后的前端资源都会存放在.nuxt/dist/ 文件夹下面 img 目录存放的是使用到的图片资源,无论是开发中存放在 assets 文件夹里的,还是static里 ...
随机推荐
- 通过phoenix导入数据到hbase出错记录
解决方法1 错误如下 -- ::, [hconnection-0x7b9e01aa-shared--pool11069-t114734] WARN org.apache.hadoop.hbase.ip ...
- Atcoder Regular Contest 060 F题第一问答案证明
一切的开始 令 \(x\) 为字符串,\(p\) 为正整数.如果对于满足 \(0\le i<|x|−p\) 的任何整数 \(i\) 满足 \(x[i]=x[i+p]\),则 \(p\) 称为 \ ...
- arts lettcode 题目
编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...
- 将lol人物模型导入到Unity3d
接下来我打算将提取出来的lol人物模型导入到Unity3D中,这样会更加好玩!(不知道如何提取lol人物模型的话请看该链接) 首先我们已经把dae文件导入到c4d中了,可以看到这是一只吹笛子的 ...
- 第07组 Alpha冲刺(6/6)
队名:摇光 队长:杨明哲 组长博客:求戳 作业博客:求再戳 队长:杨明哲 过去两天完成了哪些任务 文字/口头描述:博客生成的逻辑 展示GitHub当日代码/文档签入记录:(组内共用,已询问过助教小姐姐 ...
- 创业小记:ALL IN才是迈出创业第一步的关键
对于创业而言,能卖出这创业第一步的,大多都经过了长期反复的心理拷问与折磨. 因为当你迈出创业的那一步,你可能需要面对的是毫无收入保障的生活,以及后果自负的结局. ALL IN才是迈出创业第一步的关键( ...
- LDD3源码分析之poll分析
编译环境:Ubuntu 10.10 内核版本:2.6.32-38-generic-pae LDD3源码路径:examples/scull/pipe.c examples/scull/main.c 本 ...
- Linux零拷贝技术 直接 io
Linux零拷贝技术 .https://kknews.cc/code/2yeazxe.html https://zhuanlan.zhihu.com/p/76640160 https://clou ...
- Mac下 python2和python3共存
一般是python2默认安装了,python3没有安装,这时候一般使用命令:brew install python3 进行安装 不同方法安装python的路径是不一样的,如下所示: 接下来就要看具体步 ...
- 数据库事务和spring事务的区别
数据库事务和spring事务 本质上其实是同一个概念,spring的事务是对数据库的事务的封装,最后本质的实现还是在数据库,假如数据库不支持事务的话,spring的事务是没有作用的.数据库的事务说简单 ...