当前位置: 首页 > 知识库问答 >
问题:

正在使用调用第三方容器。net核心TestHost/TestServer通过SSL:使用Testservers CreateClient()方法绕过SSL验证

贾建茗
2023-03-14

我正在尝试将KeyClope作为testcontainer添加到我的应用程序中。net核心(5)使用dotnet testcontainers库进行集成测试。

我的问题是,我的集成测试中有一个使用自签名证书和TestServer类的容器,这使我很难获得HTTPS支持。

确切地说,我正在使用Microsofts TestServer类创建真正的API请求,其中包含一个内存配置,用于使用带有公开端口8443及其自签名证书的KeyClope testcontainer。

问题是:我无法将HttpClientHandler添加到TestServers HttpClient(通过serverCreateClient()创建)以允许此处理程序中存在不受信任的证书。我在这里创建了一个关于分支测试的具体示例。失败的测试可以在这里找到,它位于成功使用令牌的eRequestWithTokenReturnsLisToFarticles测试方法中。我给班级和创业公司添加了一些评论。DemoApi的cs-显示我尝试过的项目。

因此,TestServers内部Jwt中间件使用默认的HttpClient,并抛出以下身份验证异常:

 ---> System.IO.IOException: IDX20804: Unable to retrieve document from: 'System.String'.
 ---> System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
 ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure: RemoteCertificateNameMismatch, RemoteCertificateChainErrors
   at System.Net.Security.SslStream.SendAuthResetSignal(ProtocolToken message, ExceptionDispatchInfo exception)
   at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](TIOAdapter adapter, Boolean receiveFirst, Byte[] reAuthenticationData, Boolean isApm)
   at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Boolean async, Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---

我已经尝试了多种方法来使它工作,这些方法在代码中被注释。

>

  • DemoApi/启动。cs:尝试使用以下代码添加我自己的“测试”环境:

    ServicePointManager.期望100继续=true; ServicePointManager.安全协议类型。Tls|SecurityArchcolType.Tls11|SecurityArchcolType.Tls12; ServicePointManager.服务器证书验证回调=(发送者,证书,链,sslPolcyError)=

    在Api测试中创建TestServer实例时,通过UseEnvironment(“Testing”)使用它。调试显示调用了代码,但仍然发生异常。

    • DemoApiTestsApi/BaseFixture。csdemoapiests/Infrastructure/Persistence/keydovetest。cs:请参阅此处,了解我自己的HttpClient的一个工作实现,它使用handler来获取令牌(这在分支中起作用)GetTestToken是BaseFixture中的方法

    所以,老实说,我有点不知道如何使这个工作与TestServer或其他。本质上,我需要我在BaseFixture中使用的处理程序。GetTestToken()/KeyCloakTest.cs也在我的TestServer实例中使用,但不能在不接受参数的CreateClient()中应用它。任何帮助都是高度赞赏的,可能是一个解决方案或另一种解决方法的提示。当有另一种方法解决这个问题时,TestServer不一定是固定的。

  • 共有1个答案

    景河
    2023-03-14

    好的,我算出来了。我认为这不是最好的解决方案,但只要我没有其他的解决方案,这应该是可行的。我所要做的就是:

    1. 添加IWebHostEnvironment作为启动字段。cs并在Startup()中插入构造函数

    然后,启动过程如下所示:

            private IWebHostEnvironment CurrentEnv { get; }
    
            public Startup(IWebHostEnvironment env, IConfiguration configuration)
            {
                Configuration = configuration;
                CurrentEnv = env;
            }
    

    从现在起,剩下的事情就很简单了。在我的ConfigureServices()方法中,我现在可以通过CurrentEnv进行检查。IsEnvironment(“Testing”)如果我正在进行集成测试,那么我可以通过手动设置jwt BackChannelHandler绕过ssl验证。

    代码:

    services.ConfigureJwtAuthentication(options =>
                {
                    options.Audience = Configuration["Jwt:Audience"];
                    options.Authority = Configuration["Jwt:Issuer"];
                    options.TokenValidationParameters.ValidIssuer = options.Authority;
    
                    if (CurrentEnv.IsEnvironment("Testing"))
                    {
                        options.BackchannelHttpHandler = new HttpClientHandler()
                        {
                            ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true
                        };
                    }
                });
    

    我不得不承认,这感觉很奇怪,充其量我不需要接触任何应用程序相关的代码来使这个测试工作。最好的解决方案是从我的keyCloak测试容器中获取证书,并将其自动添加到TestServers应用程序实例的可信证书中。如果有人能给出另一个答案/关于如何处理这件事的提示,我很乐意看到。但就目前而言,这是最有效的方法。

     类似资料:
    • 我已经配置了CloseableHttpAsyncClient,如下所述 我想绕过SSL验证。我试图检查不同的配置,但没有找到解决方案。

    • 问题内容: 我正在尝试使用Amazon S3 API加密和上传文件。 如果 我不将我的 托拉斯 作为参数 传递 给我的应用程序,那会 很好 。 但是,如果 我使用我的托管人初始化我的应用程序, 如下所示: 它给了我这个错误: 如何解决此错误? 问题答案: 您的信任库没有用于保护AWS API的证书颁发机构。您需要创建一个新的信任库,并将其与AWS所需的信任库结合在一起。最简单的方法是与JRE中的密

    • 尽管我保留了verify=false,但在Python中还是出现了ssl错误。你能告诉我如何避免吗?但是curl命令使用-k选项。 错误:

    • 你能给我举几个这样做的例子吗?我找不到任何地方,如果这可以做到或不能做到。 详细信息:我用。NET Framework客户机做了一个例子,以Grpc C#Github为参考,以。NET核心客户机做了一个例子,以Grpc dotnet的这个例子为参考。我能够与…建立一个不安全的通信渠道 到ASP.NET核心服务器中的Https端口5000 如何使用安全通道进行通信。我想使用相同的pfx+密码组合。

    • 简要描述 关于反射型的基本东西,暂时就到这啦,如果后面有什么好的 case,再做增补。最近,有些人会问到怎么绕过浏览器的 XSS 过滤 器,所以从这节开始,给出点绕过的例子。当然这些绕过浏览器的方法,不是万能的。不同浏览器,不同场景都会存在差异。满足场景 要求时,才可以使用。 此文给出的是一个来自 sogili 分享的 chrome 下绕过过滤器的方法,在腾讯某处 XSS 上的应用。 这一类都算是

    • 问题内容: 如何使用Node.js通过SSL连接到MongoDB服务器? 我已经阅读了一些驱动程序(mongojs,mongodb- native )的源代码,并且我已经搜索了一段时间,但是似乎找不到任何合适的教程,指南或文档。 问题答案: 如评论中所建议,具有所需的一切。 我使用以下命令启动并运行: 编辑 你也可以从猫鼬做ssl :