IS4中如果token的類型是JWT,則需要使用RS256算法生成非對稱簽名,這意味着必須使用私鑰來簽名JWT token,並且必須使用對應的公鑰來驗證token簽名,即驗證token是否有效。使用RS256可以保證IS4服務端是JWT的唯一簽名者,因為IS4服務端是唯一擁有私鑰的一方,前提是私鑰不會被泄露。所以我們需要一個證書為我們提供私鑰和公鑰。在開發環境可以利用IS4的AddDeveloperSigningCredential方法生成RSA文件,RSA文件為我們提供私鑰和公鑰,但是RSA文件不夠安全,打開文件可以直接看到公鑰和私鑰,在生產環境我們一般會生成證書來提供私鑰和公鑰。使用OpenSSL生成證書的方式如下:
1、安裝OpenSSL工具 ,官網下載地址:https://slproweb.com/products/Win32OpenSSL.html
2、在CMD中執行以下命令
openssl req -newkey rsa:2048 -nodes -keyout cas.clientservice.key -x509 -days 365 -out cas.clientservice.cer
執行上面命令之后,我們可以在C:\Users\Andy目錄下面找到cas.clientservice.cer和cas.clientservice.key兩個文件
下面的命令是將生成的證書和Key封裝成一個文件,以便IdentityServer可以使用它們去正確地簽名tokens,文件會生成在CMD執行目錄下面“C:\Users\Andy”
openssl pkcs12 -export -in cas.clientservice.cer -inkey cas.clientservice.key -out IS4.pfx
IS4.pfx是證書名稱,可以自己修改,中途會提示讓你輸入Export Password,這個password在IS4中會用到,需要記下來。
如果執行上面的命令報錯,則需要配置環境變量,然后再執行命令:
3、配置IS4的證書
services.AddIdentityServer() //.AddDeveloperSigningCredential(true, ConstanceHelper.AppSettings.CredentialFileName) .AddSigningCredential(new X509Certificate2(Path.Combine(basePath, configuration["Certificates:Path"]), configuration["Certificates:Password"])) .AddInMemoryApiResources(Config.GetApis()) .AddInMemoryIdentityResources(Config.GetIdentityResources()) .AddInMemoryClients(Config.GetClients()) .AddProfileService<ProfileService>() .AddResourceOwnerValidator<ResourceOwnerPasswordValidator>() .AddCustomAuthorizeRequestValidator<CustomAuthorizeRequestValidator>();
4、在appsettings.json中添加證書配置信息
{ "Certificates": { "Path": "Certificates\\IS4.pfx", "Password": "xxxxxx" } }
參考資料:
https://www.cnblogs.com/edisonchou/p/identityserver4_foundation_and_quickstart_01.html
https://www.cnblogs.com/dingshuanglei/p/10237710.html
https://www.cnblogs.com/ycm-up/p/9810525.html