.NET Core JWTBearer跳过自签名证书验证,以便在本地与身份服务器进行通信

12

我有两个API项目,一个基于.NET Framework 4.6.2(旧API),另一个基于.NET Core 2.0。旧API可以很简单地禁用自签名证书验证:

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

然而,这段代码在.NET Core中无法工作(尽管它可以编译),并且在API尝试通信时引起了问题(特别是当它尝试从标识服务器获取发现文档时,在此环境中,标识服务器位于反向代理后面,反向代理使用自签名证书进行https)。我在StackOverflow上看到了类似的问题,但所有答案都与如何创建HttpClient有关。对我来说问题在于我无法控制HttpClient的创建方式(令牌验证是中间件,我看不到任何控制它如何创建HttpClient的方式),所以我想知道在.NET Core中是否有一种全局方法来跳过自签名证书验证?
编辑:我的问题似乎与此问题密切相关,然而我已将自签名证书加载到容器(运行API的位置)和我的本地机器(运行容器的位置)的受信任根目录中,但我仍然收到证书验证错误。
2个回答

32
我应该更仔细地查看JwtBearerOptions,结果发现我可以设置options.BackchannelHttpHandler
// it will work as expected
options.BackchannelHttpHandler = new HttpClientHandler {
    ServerCertificateCustomValidationCallback = delegate { return true; }
};

编辑:虽然在.NET Core中可以跳过证书验证,但我最终放弃了这种方法,因为找到所有使用HttpClient的组件并修改HttpClient以跳过证书验证变得太麻烦了。我最终选择的方法是使用easy-rsa创建一个CA,然后生成由CA签名的证书。然后,唯一的步骤就是将CA证书导入容器,它们将信任其他证书。听起来可能有点复杂,但easy-rsa命令界面相当直观,实际上并不需要太多的努力。

谢谢!也许可以在标题中添加更多关于JWTBearer的内容,以使其更易搜索?我花了很长时间才找到这个,而且正好遇到了你所遇到的问题。 - Marek Urbanowicz
1
好的,谢谢反馈。编辑:看起来已经是 ¯\_(ツ)_/¯ 了。 - riqitang

2
感谢 @riqitang。
在使用 IdentityServer 和自签名证书时,我在 asp.net core 5 中遇到了相同的问题。每当需要授权时,我经常会收到以下异常:
System.InvalidOperationException: IDX20803: Unable to obtain configuration from: 'https://localhost:5443/.well-known/openid-configuration'.

最后,在ConfigureServices方法中添加以下内容,解决了我的问题。
  services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
                .AddIdentityServerAuthentication(options =>
                {
                    ...
                    options.JwtBackChannelHandler = new HttpClientHandler
                    {
                        ServerCertificateCustomValidationCallback =
                              (message, certificate, chain, sslPolicyErrors) => true
                    };
                });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接