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
posted @ 2019-02-22 16:06  stone8386  阅读(917)  评论(0)    收藏  举报