IdentityServer4 签名密钥、验证密钥和 .Net Core 数据保护

IdentityServer4 Signing Key, Validation Key and .Net Core Data Protection

Identity Server 4 文档(此处 http://docs.identityserver.io/en/latest/topics/crypto.html?highlight=data%20protection )讨论了签名密钥和验证密钥。我知道签名密钥是使用

配置的
AddSigningCredential(<X509Certificate2>)

并且有两个用于验证密钥的 API

AddValidationKey(<X509Certificate2>)
AddValidationKeys(<Microsoft.IdentityModel.Tokens.AsymmetricSecurityKey[]>) 

该文档讨论了签署密钥滚动更新和向发现文档添加多个验证密钥。问题:

IdentityServer 使用非对称加密。非对称加密意味着您有一个 public 密钥和一个私钥。 public 密钥是共享的(显然)并且仅用于加密。私钥是私人的。应严格保护,绝不共享,用于解密。签名密钥是您的 public 密钥,而验证密钥是您的私钥,所以是的,您需要两者。可以使用 X509Certicate,因为证书同时使用 public 和私钥,但最终,IdentityServer 只是使用证书来获取密钥。

AddValidationKeys(复数)方​​法明确用于密钥翻转。例如,您的证书可能会在一年后过期(大多数情况下是默认设置)。在此期间结束时,您将用新证书替换它。但是,客户端可能仍然具有访问令牌,并且通过来自先前证书的 public 密钥进行了加密,而 IdentityServer 将需要来自先前证书的私钥来解密它。使用此方法,您可以仅出于验证目的添加以前的密钥material IdentityServer 无法使用当前密钥进行验证。

数据保护确实是完全独立的。它 使用 public 和私钥来完成它的工作,因此从技术上讲,您 可以 对 IdentityServer 使用相同的密钥.但是,最好将您的密钥限制在唯一用途上。这样,如果您确实受到威胁,您就不会 完全 受到威胁,并且可以在一定程度上限制潜在泄漏的范围。