使用IdentityServer 3时签名证书(用于签署jwt令牌)到期会发生什么?
我不清楚,我找不到任何文件,除了可以得到一个已经过期的警告。 (参考https://identityserver.github.io/Documentation/docsv2/configuration/events.html)
是否有任何机制可以停止使用过期的签名证书? 在验证由过期证书签名的令牌时,客户端(客户端是使用IdentityServer进行身份验证的Web API)会发生什么? (例如,如果https://github.com/IdentityServer/IdentityServer3.AccessTokenValidation用作中间件。)
答案 0 :(得分:0)
我刚刚测试了这个(在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在运行时引发了许多事件,例如:
...剪断
- 已过期/无效/无签名证书
默认情况下,这些事件会转发到已配置的日志提供程序 - 自定义事件服务可以以适合环境的任何方式处理或转发它们。
因此,当它已经太晚时,这将是你检测它的方式。更好的选择是定期翻转签名密钥并在密钥的有效期内,这是常见的方法,它还允许在必要时撤销受损密钥。请参阅讨论过程的this issue,基本上IdentityServer可以处理两个密钥:
[Middleware刷新]元数据文档......每天一次。
元数据文档可以容纳2个密钥 - 主要和次要,并且中间件将在存在时加载和使用两者(JWT具有允许选择正确的密钥标识符)。
当您开始翻转时 - 设置两个键并在某些时候交换主要和次要。
答案 1 :(得分:0)
免责声明:我从未使用过IdentityServer3
外界不知道您的证书,因此不知道它已过期。外界只会在以下位置看到您的公钥:
YourIdentityServer.com/.well-known/openid-configuration
或更准确地说:
YourIdentityServer.com/.well-known/openid-configuration/jwks
您可以尝试以下操作:在启动时创建一个新证书(请参见https://gist.github.com/mykeels/408a26fb9411aff8fb7506f53c77c57a)。即使将TimeSpan设置为一分钟,它也将继续工作。
但是,一旦您等待1分钟并重新启动IdentityServer,则从上次登录起的令牌将被视为无效,因为它是使用现已过时的签名密钥创建的。已根据新的公钥对其进行了检查,但失败了。
似乎建议定期用新证书替换您的证书,同时还要保留以前的密钥,请参阅“签署密钥过渡”: https://docs.identityserver.io/en/dev/topics/crypto.html#signing-key-rollover