IIS重启后/.well-known/jwks密钥变动致401,如何配置固定JWKS密钥?
OpenIddict 固定JWKS返回结果配置方案
完全可以通过显式配置持久化证书的方式实现服务重启后/.well-known/jwks返回内容固定不变,你遇到的重启后密钥变更问题,本质是默认配置下OpenIddict如果没有检测到显式指定的持久化证书,会在服务启动时自动生成临时的签名/加密密钥。
具体配置步骤如下:
- 优先准备正式的X.509证书(不要使用开发环境自带的临时开发证书),将证书导入到IIS服务器的「本地计算机\个人」证书存储区,右键证书选择「所有任务-管理私钥」,添加站点对应的IIS应用程序池用户,授予「读取」权限。
- 调整OpenIddict服务注册代码,移除
AddDevelopmentEncryptionCertificate、AddDevelopmentSigningCertificate这类生成临时证书的方法,显式加载指定的持久化证书:
builder.Services.AddOpenIddict() .AddServer(options => { // 加载本地证书存储中的签名证书 options.AddSigningCertificate( storeName: StoreName.My, storeLocation: StoreLocation.LocalMachine, thumbprint: "你的证书SHA1指纹值" ); // 加载本地证书存储中的加密证书 options.AddEncryptionCertificate( storeName: StoreName.My, storeLocation: StoreLocation.LocalMachine, thumbprint: "你的证书SHA1指纹值" ); // 其余原有配置保持不变 options.SetAuthorizationEndpointUris("connect/authorize") .SetTokenEndpointUris("connect/token") .SetJWKSURIPath("/.well-known/jwks"); });
- 如果不方便将证书导入服务器存储,也可以直接读取物理PFX证书文件,注意将证书放到站点根目录外的安全路径,避免被外部用户下载:
// 加载物理证书文件,第二个参数为证书的访问密码 var signingCert = new X509Certificate2("D:\\cert\\signing.pfx", "你的证书密码"); var encryptionCert = new X509Certificate2("D:\\cert\\encryption.pfx", "你的证书密码"); builder.Services.AddOpenIddict() .AddServer(options => { options.AddSigningCertificate(signingCert); options.AddEncryptionCertificate(encryptionCert); // 其余原有配置保持不变 });
- 配置完成后重启IIS站点,多次重启后访问
/.well-known/jwks验证返回的密钥集合是否完全一致即可。
提示:如果此前已经使用临时证书签发过有效令牌,更换固定证书后旧令牌会全部失效,建议提前配置密钥滚动策略,同时保留旧证书作为验证密钥一段时间,避免依赖方业务受影响。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

