IdentityServer4:发布环境的数字签名证书

一,jwt的三个组成部件

先来看一个由IdentityServer颁发的一个标准令牌

eyJhbGciOiJSUzI1NiIsImtpZCI6IjBiNTE3ZjIzYWY0OGM4ZjkyZjExMzM5MDMwZTI5NDkwIiwidHlwIjoiSldUIn0.eyJuYmYiOjE1Njk4MDUxNzgsImV4cCI6MTU2OTgwNTQ3OCwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjoiYXBpQ2xpZW50SHlicmlkIiwibm9uY2UiOiI2MzcwNTQwMTk2OTg5ODM3MjAuTnpZM016RTFObVF0WXpBMFlpMDBNR1k1TFdGbE1qY3RORGc0WldJMVl6RmpOemMzWW1Sa05URXdabUV0T1RKbU9DMDBZemRsTFdFNE16TXRaV0l6T0dabE5tWmlOamRoIiwiaWF0IjoxNTY5ODA1MTc4LCJhdF9oYXNoIjoiMzRmemR5QzJmWFNCN3QzYl9mOW1VUSIsInNpZCI6IjIyOWU0OWRmOTZkY2U0OTVjMjZkMzI4MDhjMDM3MTk3Iiwic3ViIjoiMCIsImF1dGhfdGltZSI6MTU2OTgwNTE3NSwiaWRwIjoibG9jYWwiLCJuYW1lIjoiYXBpVXNlciIsInBob25lbW9kZWwiOiJodWF3ZWkiLCJhbXIiOlsicHdkIl19.rjksvMQkguG6qgQed7NZumdtcyDiEBuy9pDpEB-DOCGjqHF8BwI9CAWEOEbdb6PI9qBdFaZdafREZSodoL8qZMbd5ss2yrt01jhCaT00V54_ySFfyaBwpy8PFlasdygQEgEF44ZMLkaMWuVu_dV22wkE1y5TCsPj-5hM7CpLiDDwaQvEVMe8FEZbJAZ8wskvnAFLY7P37LzjjPDWXW3hB10e-teNel2yXzsnlwpebQnLwUD46tKwAt4XDJ7yYqkuQ1y_dVvqJYf2awEeZPSn7tzThTaz5HPCNvPwiO_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 []:[email protected]
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方式加载密钥证书。

  

  

  

  

  

 

原文地址:https://www.cnblogs.com/liujiabing/p/11611926.html

时间: 2024-11-24 17:03:52

IdentityServer4:发布环境的数字签名证书的相关文章

windows下如何制作和应用数字签名证书 全流程

目前我们在发布应用程序时,有时用户下载后会被360杀毒当做木马直接隔离.为应用程序可执行文件打上数字签名可以让360杀毒放宽检测规则.下文是讲述如何制作数字签名证书的过程. 需要准备的工具:makecert.exe.cert2spc.exe.pvk2pfx.exe.signtool.exe. 在MS的SDK6.0中有个证书生成工具makecert.exe, 你可以使用这个工具来生成测试用的证书. 第一步,生成一个自签名的根证书(issuer,签发者). >makecert -n "CN=R

APK文件没有数字签名证书

今天新測试人员告诉我 APK安不上 我查看 某手机助手 安装我的apk的时候提示: "APK文件没有数字签名证书." apk包安装不到手机上 应用没签名 由于不想每次打包都签名 所以给測试人员了设置了一下手机 不同的手机品牌可能设置的操作不太同样 解决的方法  : 设置-应用程序-未知源   选择同意安装来自未知来源的应用 设置-安全 -未知来源     选择同意安装来自未知来源的应用 设置-安全和隐私 -未知来源     选择同意安装来自未知来源的应用

CentOS + Python3.6+ Django2.0 + uwsgi + nginx + mysql web发布环境搭建

目录: CentOS上升级Python 安装easy_install和pip uwsgi安装及测试 Django安装及测试 连接uwsgi与Django nginx安装及测试 连接uwsgi与nginx 连接uwsgi与Django与nginx uwsgi ini mysql安装设置 python3 Django mysql连接及测试 快速搭建blog测试 Pycharm开发 如果只是想学习django开发直接用django本身自带的开发用服务器即可. 1. CentOS上升级Python 用的

VUE 利用webpack 给生产环境和发布环境配置不同的接口地址

第一步,分别设置不同的接口地址 首先,我们分别找到下面的文件: /config/dev.env.js /config/prod.env.js 其实,这两个文件就是针对生产环境和发布环境设置不同参数的文件.我们打开dev.en.js文件.代码如下: var merge = require('webpack-merge') var prodEnv = require('./prod.env') module.exports = merge(prodEnv, { NODE_ENV: '"develop

vue cli脚手架项目利用webpack给生产环境和发布环境配置不同的接口地址或者不同的变量值。

废话不多说,直接进入正题,此文以配置不同的接口域名地址为例子 项目根目录下有一个config文件夹,基础项目的话里面至少包括三个文件, 1.dev.env.js 2.index.js 3.prod.env.js 我们需要做配置的就是第一个和第三个. 其实这两个文件内容就是针对生产环境和发布环境设置不同的参数的文件,那么打开dev.en.js,开发环境.原本代码如下: 'use strict' const merge = require('webpack-merge') const prodEnv

免费的软件数字签名证书申请流程

现在很多人希望自己的程序拥有一个数字签名,这样可以很大程度上防止误报. 博主也是这么想的,于是博主想申请个数字签名证书. 这里有一个叫宇盾的数字签名,博主试了一下还行. 这里附上他们的官网链接:www.down1s.com 注意要阅读他们的用户协议,他们是禁止违法的程序签名的! 我们可以免费试用他们的测试数字证书 下载后,如果不会签名可以看一下他们的教程 教程链接 反正官网上说的很详细了. 但是测试证书是不能防止误报的,你需要购买他们的正式证书. 博主我买了,还是挺好的(2040年到期) 原文地

nuxtjs如何部署cdn及区分发布环境

1.部署cdn nuxt  build 后的前端资源都会存放在.nuxt/dist/ 文件夹下面 img 目录存放的是使用到的图片资源,无论是开发中存放在 assets 文件夹里的,还是static里的,都会统一生成到该目录里 layouts 目录存放是layout 的布局js pages 目录存放的是路由页面的js 其他的文件为nuxt创建的一些公共库和配置文件 所以部署cdn的时候,只要将 dist 文件夹推送到cdn服务器就行了 然后下一步更改 publicPath ,这样子在nuxt b

LAMP环境添加SSL证书,使网站变成HTTPS加密传输

一 简介 目前国内大部分网站都是采用的HTTP协议,也就是明文传输数据,与此同时SSL证书最近几年逐渐开始在国外普及.安装SSL证书之后数据就可以进行加密传输,在浏览器中看到的效果就是:在地址栏前面带有一个绿色小锁,同时URL地址是以HTTPS开头的 下面我将简单介绍如果在LAMP环境(Linux+Apache+MySQL+PHP)下添加SSL证书的详细步骤: 二 获取证书 付费的证书有很多,这里就不说了.关于免费证书据我了解的就有:沃通免费SSL证书以及StartSSL免费SSL证书.如果想要

QGIS SERVER QGIS 用于 发布环境WEB 地图

我们可以直接将QGIS编辑和配置的地图成果, 发布为标准的OGC地图服务.而不需要再转换为GEOSERVER工程发布.这样可以避免样式的重新配置和数据的重新组织.并且通过QGIS的扩展开发可以灵活的定制自己想要的应用. 发布后的地图服务,利用QGIS加载 发布后的地图服务利用OPENLAYERS加载 提示:所有环境环境所使用的QGIS SDK ,包括:QGIS FOR ANDRIOD.androidQGIS FOR LINUX.androidQGIS FOR LINUX.QGISSERVER.Q