IdentityServer4: 使用固定證書

固定證書

簡介

爲了保證 IdentityServer4 發佈的令牌不被人篡改和僞造,使用簽名算法生成的一個簽名字符串來保護令牌。IdentityServer4 的簽名算法使用 RSA256 加密算法,RSA256 是一個非對稱加密算法,用私鑰來加密,公鑰來解密。私鑰必須保證安全性,保存在 IdentityServer4 服務器端,而公鑰可以公佈出去,公鑰是公開的,如果私鑰被泄露就很容易被人篡改和僞造令牌。IdentityServer4 爲了保護私鑰安全,提供了開發環境和生產環境的密鑰證書,分別爲:

  • (1) AddDeveloperSigningCredential:會創建一個臨時密鑰證書供調試環境用。
  • (2) AddSigningCredential:需要指定一個固定的證書,用於生產環境,此時就需要拿到機構頒發的密鑰證書,放在 IdentityServer4 服務器上,並在此方法中指定,這樣就不會出現臨時密鑰證書發生變化的情況。

生產環境

生產環境下一般需要使用固定證書籤名和驗證,以保證在重新啓動IdentityServer4 服務器的時候 Token 能驗證通過,而不是使用的
臨時證書,導致驗證失敗。
這裏,我們使用 OpenSSL 工具來生成一個固定的 RSA256 加密證書,用於生產環境。
注意:RSA256 加密證書的長度要求在 2048 以上。

生成證書

下載 OpenSSL 工具

到 OpenSSL 工具的官方網站上下載,地址如下:
https://slproweb.com/products/Win32OpenSSL.html

點擊“Win64OpenSSL_Light-3_0_8”(用戶使用的版本)的“EXE”或“MSI”格式的文件下載,這裏下載的是“*.msi”格式的安裝程序:
Win64OpenSSL_Light-3_0_8.msi,雙擊進行安裝,記住安裝路徑, 本示例的安裝路徑爲:C:\Program Files\OpenSSL-Win64,記住這個目錄,等會會用到。

設置環境變量

在 Windows10 系統中,OpenSSL 工具安裝完成之後,需要設置一下環境變量,在“系統變量”文本框中選擇“Path”,添加變量:
C:\Program Files\OpenSSL-Win64

生成 KEY

OpenSSL 工具安裝完成,會得到一個工具【Win64 OpenSSL Command Prompt】工具,打開它,在命令提示符下輸入如下命令生成 KEY:

C:\Users\wei> openssl req -newkey rsa:2048 -nodes -keyout mvcclient.key -x509 -days 365 -out mvcclient.cer

.....+.........+......+......+.+.....+.......+...+.........+..............+++++++++++++++++++*..+.........+.+.....+....+...+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
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]:Hongkong
Locality Name (eg, city) []:HK
Organization Name (eg, company) [Internet Widgits Pty Ltd]:KFC
Organizational Unit Name (eg, section) []:KFC-D
Common Name (e.g. server FQDN or YOUR name) []:DEV
Email Address []:[email protected]

這些信息可以任意輸入,輸入完成後,KEY 也就生成了。打開“C:\Users\wei”目錄,查看一下生成的 KEY 文件:

mvcclient.key 和 mvcclient.cer

這 2 個文件就是剛纔命令生成的。
(1) mvcclient.key:表示私鑰文件,要妥善保管。
(2) mvcclient.cer:表示證書文件,包含持有人的信息,持有人的公鑰,以及簽署者的簽名等信息。
當用戶安裝了證書之後,便意味着信任了此證書,同時擁有了其中的公鑰。

合併成.pfx 文件

*.pfx 文件可以使用密碼保護起來,這樣更安全一些,所以,我們要將證書文件和私鑰文件合併成一個*.pfx 文件。
這裏使用 OpenSSL 命令合併文件,命令如下:

openssl pkcs12 -export -in mvcclient.cer -inkey mvcclient.key -out mvcclient.pfx
Enter Export Password:123456
Verifying - Enter Export Password:123456

命令執行後,需要輸入 2 次密碼,輸入的密碼必須一致,輸入時密碼不顯示,密碼要牢記。
完成後,在目錄看到的“mvcclient.pfx”文件,這就是合併後的加密證書文件,我們在 IdentityServer4 服務器上就是使用這個證書。

使用證書

配置證書

在 IdentityServer4項目的 appsettings.json 文件中配置證書:

  "Certificates": {
    "CerPath": "Certificates\\mvcclient.pfx",
    "Password": "123456"
  }

(1) CerPath 指定證書文件的路徑。
(2) Password 指定生成.pfx 證書時輸入的密碼。需要將.pfx 證書文件放在一個安全的目錄中。

加載證書

在 IdentityServer4 項目的 Program 類中將開發環境下的臨時證書修改爲生產環境下的固定證書:
將如下這一行代碼:
builder.AddDeveloperSigningCredential();
替換爲:

//註冊IdentityServer
var ids4Builder = builder.Services.AddIdentityServer()...;
//獲取證書路徑
var path = Path.Combine(Environment.CurrentDirectory, builder.Configuration["Certificates:CerPath"]);
//獲取證書密碼
var pwd = builder.Configuration["Certificates:Password"];
//生成X509證書
var cert = new X509Certificate2(path, pwd);
//在生產環境下使用固定證書
ids4Builder.AddSigningCredential(cert);

此代碼說明如下:
(1). 需要添加 System.Security.Cryptography.X509Certificates 命名空間。
(2). 使用 Environment.CurrentDirectory 獲取當前應用程序的工作目錄:
如果未發佈,則工作目錄就是:*\bin\Debug\net6.0
如果已發佈,則工作目錄就是:*\bin\Release\net6.0\publish, *是項目的路徑。
(3). 使用 Configuration["Certificates:CerPath"]獲取 appsettings.json 配置文件中配置的證書路徑。
(4). 使用 Configuration["Certificates:Password"]在 appsettings.json 中獲取生成證書時的密碼。
(5). 使用 new X509Certificate2(path, pwd)根據證書路徑和密碼生成 X509 證書。
(6). 最後使用 AddSigningCredential(cert)在生產環境下加載固定證書。

在 IdentityServer4 項目根目錄添加一個名稱爲
Certificates 的文件夾,然後將omvcclient.pfx 證書文件複製到此文件夾中.
發佈項目的時候要注意,Certificates 不會隨發佈項目時一起發佈,需要單獨發佈,右擊“Certificates”文件夾,選擇“發佈
Certificates”即可將該文件夾發佈發佈目錄下。
如果運行發佈後的*.exe 文件,則必須單獨發佈 Certificates 文件夾,否則證書將無法加載。

在生產環境下加載固定證書,使用 IdentityServer4 認證和授權,並訪問受保護的 API 資源已經成功實現了,基於此方法,可以在實際項目中使用。

啓動 IdentityServer4 項目,此時在生產環境下加載固定證書,使用 IdentityServer4 認證和授權,並訪問受保護的 API 資源已經成功實現了,基於此方法,可以在實際項目中使用。

驗證 AccessToken

我們可以將得到的token在 https://jwt.io 網站來認證一下:把後綴爲 .cer的公鑰、key的私鑰複製到驗證中,看到【Signature Verified】的字樣,表明 AccessToken 沒有被篡改,如下圖所示:

AccessToken

eyJhbGciOiJSUzI1NiIsImtpZCI6IjQzMjE3QzNGNzY1MEVGRUIyNTU4RTNERjc2REY4QzJDRTVEQ0ZDNkFSUzI1NiIsInR5cCI6ImF0K2p3dCIsIng1dCI6IlF5RjhQM1pRNy1zbFdPUGZkdC1NTE9YY19HbyJ9.eyJuYmYiOjE2NzgyODE0NDUsImV4cCI6MTY3ODI4NTA0NSwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NjAwMSIsImNsaWVudF9pZCI6Ik12Y0FwcCIsInN1YiI6IjAwMDAxIiwiYXV0aF90aW1lIjoxNjc4MjgxNDQyLCJpZHAiOiJsb2NhbCIsImp0aSI6IjQ3MkZFN0JEMzZGMjE0MjJBQTU5MTQyQzY2NjI4RjgzIiwic2lkIjoiOTAzOENDNEZBN0IxNkE2NUNCNTZEMDg5Q0RDM0MwMzgiLCJpYXQiOjE2NzgyODE0NDUsInNjb3BlIjpbIm9wZW5pZCIsInByb2ZpbGUiLCJPQUFQSSIsIm9mZmxpbmVfYWNjZXNzIl0sImFtciI6WyJwd2QiXX0.Pq6Jr1t9U0kbqOKRfBokuLud0G8r7b39gtxrpSjDdZJk2JP79s48OpBGC7T11SGyAAO3Y54-PwZZdsKu72XFnu1he7YeEdTPYNpx-WUK_3oyiZHbB75tLGAeiTHLsr3m1mO8Q-oKQjPgXDxZ13qEfQBeaXhNbQw4_pPwEu80e_gkURkgeN1Tlq0EeqZTs7MF8dluLiiYFfd5Lk71htUjevWtuv9ASUf6vO3MBL5WlWNqGvcAtjgMLBe5P0sqnI_ZTue7gpLPbCvJ8ybAuYIAnIxw6i7kwkCktrHpHu33jHqH5vK8aDev16THtJVOyaIBzoc1lqZY3DMhr81Y5Y1LlQ

公鑰:mvcclient.cer

-----BEGIN CERTIFICATE-----
MIID1zCCAr+gAwIBAgIUcs/nIjEyzVsMhTYcjW8XsiEDUrQwDQYJKoZIhvcNAQEL
BQAwezELMAkGA1UEBhMCQ04xETAPBgNVBAgMCEhvbmdrb25nMQswCQYDVQQHDAJI
SzEMMAoGA1UECgwDS0ZDMQ4wDAYDVQQLDAVLRkMtRDEMMAoGA1UEAwwDREVWMSAw
HgYJKoZIhvcNAQkBFhFrZWl2aW5AZG90bmV0LmNvbTAeFw0yMzAzMDgxMjU0MDda
Fw0yNDAzMDcxMjU0MDdaMHsxCzAJBgNVBAYTAkNOMREwDwYDVQQIDAhIb25na29u
ZzELMAkGA1UEBwwCSEsxDDAKBgNVBAoMA0tGQzEOMAwGA1UECwwFS0ZDLUQxDDAK
BgNVBAMMA0RFVjEgMB4GCSqGSIb3DQEJARYRa2VpdmluQGRvdG5ldC5jb20wggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCn3FYlgavMkyL9I4kJRnkF22yO
3Eftm5rxVusa6JM9kpFFFRuUrF6q6loDQApfTqtorpaQhiyp+FeLNNtvm4n6vf/k
gmO4rBsTtzvTWLj2b94DIs2ZTuSjD1w0elU4d+Wgbu9rNNZdS60XAcdp0t/3O0Ww
r8Y00YRUTWMbND97Yf81JEmzG+6W8/k67GPFRTqRymaIkhnpfBf5oPHI0fz2z6Yz
5lsIt5SmZmZCu/w17TGimEkLKMmhEoi84/Mekie4Puo4Cao2UKSABDCItHIofYbT
jUPyk30OfaWQwtl83Zi/01fZ+5/6nVVqNIIxJjVGotItFJoFtpHIVjCvk3wvAgMB
AAGjUzBRMB0GA1UdDgQWBBT0O6teRxunyychvP1bbTYDU0SBRzAfBgNVHSMEGDAW
gBT0O6teRxunyychvP1bbTYDU0SBRzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
DQEBCwUAA4IBAQBnuKRw5Jl0kBT9xhniDu3jLuC49GA6AhPKDopim7pchtCrNUI6
G5NZh01yZ4xX3/hAVqTzbigp2vIRaDW/W7n0v8dlwwXZpIC6Kzq3+2ylFGAhghwi
HJW/efTqod1zjdGUYuyLp3U1qfLtNxIuPdSpy/+QeBA1CjmyR7hnO0xSeDseGFxn
4HxbXfsNVSvu/NK6iwrlo080SEUts4cu08qHeitVuIF6b6t2/m1Sk1GpLKz3tb+N
jRHrf3gOnqQNQWhyzQD3QWjtsd1UhYR7mZUzXIQ27Gq6QpIwen/1fOz9puWkTq2O
wSwV1198ePpA1NijlqlL1Vmoe1ODbmj8377k
-----END CERTIFICATE-----

私鑰:mvcclient.key

-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCn3FYlgavMkyL9
I4kJRnkF22yO3Eftm5rxVusa6JM9kpFFFRuUrF6q6loDQApfTqtorpaQhiyp+FeL
NNtvm4n6vf/kgmO4rBsTtzvTWLj2b94DIs2ZTuSjD1w0elU4d+Wgbu9rNNZdS60X
Acdp0t/3O0Wwr8Y00YRUTWMbND97Yf81JEmzG+6W8/k67GPFRTqRymaIkhnpfBf5
oPHI0fz2z6Yz5lsIt5SmZmZCu/w17TGimEkLKMmhEoi84/Mekie4Puo4Cao2UKSA
BDCItHIofYbTjUPyk30OfaWQwtl83Zi/01fZ+5/6nVVqNIIxJjVGotItFJoFtpHI
VjCvk3wvAgMBAAECggEATOIFbv5acsO9ldXt0Rq/Gairqy9HnpPTvtBBtLxrnBsC
gHKvhEQCxCO8gJqXZZnBtpuoiJ9724nMhwz5qL/Dzd2yU7ZI+G+To08cjqunY/BO
7n7FTn+tBuZlJAAYAlogCYBmFmNH/8lGiTAeZuDYBgPW4ptPnCeOhZJAX1hp7xdw
fBbnWiQ8R16vsGhuCrfP2XGcN0DT8hBqdm8o9kD0L5ro+wubPky5IFUcUxJPnkIu
R0wIUtt0epJGRjpqi2q99paqKEOzo5QZxkZBhlQck9BogYMC/aBl2Mh4APcnI05k
T1Q5zXTl3tEbtaSZz5eYxukDpA8WWWxfpZx7X1UnMQKBgQDKoFwMqX+RHxv1vpUH
L3z9BInzIpDiMKSmBeRzuFXJ4jUb9bPgnyfv/GNiGiSTERELB0Yzkbi0jYGvKUXQ
UUqXtY2F6ZIOxtJD+06adxdc3k4KTUEJKK6CvTs4Mz7r1mT97SQDqyPWOWqISYD/
yOjZsDMGoW7U1PN7mTfQxJgESQKBgQDUE6G8rLjN19C4o4dZAqiEond885g0XNvO
pk8rtaylbQSPs5qiYLEWnxfhP/ZwG16Uw+nk+UX9xr5ByDcy6ePlLoy2gTrkwtyq
RQkH4GygAajEevEh59N/tcydxyO1ekfKeV6upcIj1cuCFD0JP+nX8idq5DFYH6f/
4dUQVw0MtwKBgH9FMgwR+rpgW+ODDYAx58PUsgExWOd5vjE5ykCVK+1eVBV3wr/3
t9IZKSNZYFevhJD0xLdndCiUKTyoI92w8bVQp8/Q4Zi+cRuaIckLvHTsfQAjfhIO
p24fBa9LIN5pD44fAVv8hsnrzmpEIO6IdxkkfyhPBZpRF44ussxCb2lhAoGACni9
r7dHmMJjR/qrIDYFZCcxhzXv+gXrxJRprFrYH4L2irHvnLzxgZBxeWnTHU38qZPS
5L96OUGq+0yLjTQHULWvtQNEiS8l/jJSc9UdB/mM/8aiSW5M/y1W4SOIG9nh2ZmM
l0sP/vz7g3zEVsSVI1iNobWKyjMl9HiOMLRbrJkCgYEAnGI2DZO7p3+yPf1zIWVg
AL7B7rBQYz7UNYATEYS/6eBbnXFqF7ozBbS5MTALsk3QghF8SexamzBQPJfe3WQv
Yp/0nK8E5MJtVzEi1Xz3EtHyuhEHa3ngPEkc/iAOHCKeA6HtcP/f8zRfPTMfrG3L
s05wTYNm2oDyroJ1ze6QCoI=
-----END PRIVATE KEY-----
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章