IdentityServer 3 签名证书到期

IdentityServer 3 signing certificate expiry

使用 IdentityServer 3 时签名证书(用于签署 jwt 令牌)过期时会发生什么?

我不清楚,我找不到任何文档,除此之外可能会收到一条警告,指出它已过期。 (参考 https://identityserver.github.io/Documentation/docsv2/configuration/events.html

是否有任何机制可以停止使用过期的签名证书?
在验证由过期证书签名的令牌时,客户端(客户端是使用 IdentityServer 进行身份验证的 Web API)会发生什么? (例如,如果 https://github.com/IdentityServer/IdentityServer3.AccessTokenValidation 用作中间件。)

我刚刚(在 IdentityServer4 上)对此进行了测试,它似乎可以继续愉快地使用过期的签名证书,这是我的测试证书的有效性:

我能够登录,获取 ID 令牌和访问令牌,然后使用访问令牌访问 API。然而,IdentityServer 所做的是记录警告:

2017-07-13 12:15:54.871 +02:00 [Warning] 
    Certificate "CN=test_expired_signing_certificate" has expired on "13/07/2016 14:14:37"

这与 IdentityServer (3) 文档所说的相符 here:

IdentityServer raises a number of events at runtime, e.g:

snip...

  • Expired/invalid/no signing certificate

By default these events are forwarded to the configured log provider - a custom event service can process or forward them in any way suitable for the environment.

所以这将是您在为时已晚时检测它的方法。更好的选择是在密钥的有效期内定期更新签名密钥,这是常见的方法,它还允许在必要时撤销泄露的密钥。参见 this issue 讨论过程的地方,基本上 IdentityServer 可以处理两个键:

[Middleware refreshes] the metadata document ... once a day.

The metadata doc can hold 2 keys - primary and secondary and the middleware will load and use both when present (JWTs have a key identifier that allows picking the right one).

When you start to rollover - set both keys and at some point swap primary and secondary.

免责声明:我从未使用过 IdentityServer3

外界不知道您的证书,因此不知道它已经过期。外界只能在以下位置看到您的 public 密钥:

YourIdentityServer.com/.well-known/openid-configuration

或更准确地说:

YourIdentityServer.com/.well-known/openid-configuration/jwks

您可以试试这个:在启动时创建一个新证书(请参阅 https://gist.github.com/mykeels/408a26fb9411aff8fb7506f53c77c57a)。即使您将 TimeSpan 设置为一分钟,它也会继续工作。

但是一旦您等待 1 分钟并重新启动您的 IdentityServer,您上次登录的令牌将被视为无效,因为它是使用现已过时的签名密钥创建的。它针对新的 public 密钥进行检查但失败了。

似乎建议定期用新证书替换您的证书,同时保留以前的密钥,请参阅“签名密钥更新”: https://docs.identityserver.io/en/dev/topics/crypto.html#signing-key-rollover