IdentityServer4 自制证书
IdentityServer4中生成token默认都是采用RSA256算法(非对称算法)签名的JWT格式。生产环境一般需要使用固定的证书签名与验签,以确保重启服务端的时候 Token 都能验签通过。(不使用临时证书,比如程序目录下的tempkey.rsa)。
证书的制作采用OpenSSL进行操作,需要下载安装openssl工具包。在window平台下由于git中就包含该工具包,只要把git程序的user/bin目录加到环境参数 path中,就能直接使用了。我当前win7下目录为:
C:\Program Files\Git\usr\bin
第一步 生成私钥文件private.key:
openssl genrsa -out private.key 2048
第二步 创建证书签名请求文件 signrequest.csr CSR(Certificate Signing Request),用于提交给证书颁发机构(即 Certification Authority (CA))即对证书签名,申请一个数字证书。
openssl req -new -key private.key -out signrequest.csr
第三步 生成自签名证书idsrv4.crt,生成的证书文件包含公钥
crt 证书包含持有人的信息,持有人的公钥,以及签署者的签名等信息
openssl x509 -req -days 365 -in signrequest.csr -signkey private.key -out idsrv4.crt
第四步 自签名证书与私匙合并成一个文件idsrv4.pfx(注:.pfx中可以加密码保护,所以相对安全些)
在生成的过程中会让我们输入Export Password
openssl pkcs12 -export -in idsrv4.crt -inkey private.key -out idsrv4.pfx
这样我们就生成了四个文件

自制证书
将idsrv4.pfx文件保存到项目目录下进行调用

项目下的证书文件
将证书存放位置、密码保存配置文件appsettings.json中
{
"ConnectionStrings": {
"DefaultConnection": "..."
},
"Certificates": {
"CerPath": "Certificate\\idsrv4.pfx",
"Password": "!1password"
},
...
}
}
在启动文件 Startup.cs 中注册证书
var cerFile = System.IO.Path.Combine(HostingEnvironment.ContentRootPath, Configuration["Certificates:CerPath"]);
services.AddIdentityServer()
.AddSigningCredential(
new X509Certificate2(
cerFile,
Configuration["Certificates:Password"]
)
)
启动IdentityServer4,使用Postman进行测试

Postman测试
输入信息
POST /connect/token HTTP/1.1
Host: localhost:5000
Cache-Control: no-cache
Postman-Token: cfcc443a-3257-319b-1c10-35c3ca1c72a6
Content-Type: application/x-www-form-urlencoded
client_id=pwdClient&client_secret=superSecretPassword&grant_type=password&scope=smsAPI.send&username=demo%40qq.com&password=!1Demo
输出信息
{
"access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjBBODE1Rjg2RENENzJDNjJCOTVDQjkxQkIwNDk1MTY5QTNERTNDQkQiLCJ0eXAiOiJKV1QiLCJ4NXQiOiJDb0ZmaHR6WExHSzVYTGtic0VsUmFhUGVQTDAifQ.eyJuYmYiOjE1NDY1OTM1NzMsImV4cCI6MTU0NjU5NzE3MywiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjpbImh0dHA6Ly9sb2NhbGhvc3Q6NTAwMC9yZXNvdXJjZXMiLCJzbXNBUEkiXSwiY2xpZW50X2lkIjoicHdkQ2xpZW50Iiwic3ViIjoiOTk3ZDI3NWItZTE2ZC00MTlkLThlMTUtOWZiMGY4NjNkYzM4IiwiYXV0aF90aW1lIjoxNTQ2NTkzNTczLCJpZHAiOiJsb2NhbCIsInNjb3BlIjpbInNtc0FQSS5zZW5kIl0sImFtciI6WyJwd2QiXX0.oDSqYCml3s8g6yE8XHbemo0o8ZwJBiF0RFUgR557sM3fEWDN4XLtOab33aVr9e-1bKGRQ0S0SRC1CZUmZZ1amYC4ARFOXCuOSiVBKdvzQPv1Hte0kEaO4NndLKe0p2vu9jBiVaG_sYJXTw2CKwkkSpOhvnwb3_hpoI6lQfjrcI_-CDqvqck4lKNcj3DthBPCFoZwU2QrP5Yxd13NkewN_WuCprScvq79kdfCAp_27z3hPPHMm5NVjz5Z5ViQmX0AhYD8aiQIBoaDhkFEDYC2V5bjWxxhsgBq6gGXz0WRxd0XWmcpLkvofxLM4q4aOKSvKxwRR_KzdXEb66Va5vdeCQ",
"expires_in": 3600,
"token_type": "Bearer"
}
将上述access_token字段粘贴到jwt.io上进行解析, 将包含公钥的idsrv4.crt 中内容粘贴到公钥输入框

https://www.jianshu.com/p/f8927d4b0118

浙公网安备 33010602011771号