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

Bra*_*ote 5 identityserver4 asp.net-core-identity asp.net-core-2.0

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

AddSigningCredential(<X509Certificate2>)
Run Code Online (Sandbox Code Playgroud)

有两个用于验证密钥的API

AddValidationKey(<X509Certificate2>)
AddValidationKeys(<Microsoft.IdentityModel.Tokens.AsymmetricSecurityKey[]>) 
Run Code Online (Sandbox Code Playgroud)

该文档讨论了对密钥过渡进行签名并将多个验证密钥添加到发现文档中。问题-

Chr*_*att 7

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

AddValidationKeys(多个)方法被明确地用于密钥翻转。例如,您的证书可能会在一年后过期(在大多数情况下为默认值)。在此期间结束时,您将其替换为新证书。但是,客户端可能仍然具有访问令牌,并且已通过先前证书中的公钥对访问令牌进行了加密,并且IdentityServer需要先前证书中的私钥来对其进行解密。使用此方法,可以仅添加先前的密钥,以用于验证材料IdentityServer无法使用当前密钥进行验证。

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

  • 上述答案中的一个问题是“签名密钥是您的私钥,而不是公钥,而验证密钥是您的公钥,而不是私钥。 (2认同)
  • @Haukman:一件事是加密,另一件事是用签名签名。就像克里斯所说的那样,加密是公开进行的,因此只有私钥的所有者才能解密。签名是用私人的,所以只有那个人可以签名,其他人都可以验证这个签名是不是只有私钥的所有者。加密和签名在它们之间起作用。IdentityServer 不加密 JWT,它只需要对它们进行签名,以便任何人都可以验证它们并知道它们没有被篡改。 (2认同)
  • 阅读这篇[文章](https://brockallen.com/2019/08/09/identityserver-and-signing-key-rotation/)后,我发现当我们想要包含其他密钥时应该使用“AddValidationKey”(密钥翻转),这意味着如果我们只有一个用于签名的证书,则可以单独使用“AddSigningCredential”(尽管我们应该为未来做好准备并以密钥翻转为目标)。另外,你的解释让我澄清了@ChrisPratt,谢谢。 (2认同)