猿问

Flurl 和不受信任的证书

目前我在 Flurl 工作,并尝试在 https 中联系 API(我在我的实验室)。所以证书无效,Flurl 无法继续工作:/

这是我的错误信息:

Unhandled Exception: System.AggregateException: One or more errors occurred. (Call failed. The SSL connection could not be established, see inner exception. POST https://IP/api/aaaLogin.json) ---> Flurl.Http.FlurlHttpException: Call failed. The SSL connection could not be established, see inner exception. POST https://IP/api/aaaLogin.json ---> 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.

在 Flurl 文档中我们可以使用using Flurl.Http.Configuration;和修改DefaultHttpClientFactory但是我不理解指定的元素来表示跳过错误。

在网上我可以看到同样的情况:https ://github.com/tmenier/Flurl/issues/365 你有这个问题的问题吗?

谢谢!


浮云间
浏览 490回答 3
3回答

扬帆大鱼

最典型的方法是创建一个自定义工厂:public class UntrustedCertClientFactory : DefaultHttpClientFactory{    public override HttpMessageHandler CreateMessageHandler() {        return new HttpClientHandler {            ServerCertificateCustomValidationCallback = (_, _, _, _) => true        };    }}然后在你的应用启动中注册它:FlurlHttp.ConfigureClient("https://theapi.com", cli =>    cli.Settings.HttpClientFactory = new UntrustedCertClientFactory());FlurlHttpClient默认为每个主机重用相同的实例,因此配置这种方式意味着每次调用都theapi.com将允许使用不受信任的证书。HttpClient与将 an 传递给构造函数相比,它的优势FlurlClient在于它使此配置“偏向一边”,并且在您以更典型/更简洁的方式使用 Flurl 时工作:await "https://theapi.com/endpoint".GetJsonAsync();

慕哥9229398

这是我对 Flurl 的设置,它适用于不受信任的证书:HttpClientHandler httpClientHandler = new HttpClientHandler();httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain,&nbsp;&nbsp; errors) => true;HttpClient httpClient = new HttpClient(httpClientHandler);httpClient.BaseAddress = new Uri("https://myaddress.com");var flurlClient = new FlurlClient(httpClient);var apiInfo = await flurlClient.Request("apiInfo").GetJsonAsync<ApiInfoDto>();我创建了自定义 HttpClientHandler,它接受ServerCertificateCustomValidationCallback. 当然,您可以在此处理程序中使用其他逻辑。更新: 使用此设置,您不能对 URL 使用 Flurl 扩展(您不能编写"http://myadress.com/apiInfo".GetJsonAsync<ApiInfoDto>()。您必须如上所示创建 Flurl 客户端并使用 Flurl 客户端进行调用,如我的代码中所示。用法与 Flurl 扩展相同网址。

30秒到达战场

接受任何证书的内联解决方案是:var myString = await "https://some-server-with-an-invalid-cert.net"&nbsp; &nbsp; .AppendPathSegment("/some-file.txt")&nbsp; &nbsp; .WithClient(new FlurlClient(new HttpClient(new HttpClientHandler&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ServerCertificateCustomValidationCallback = (message, cert, chain,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;errors) => true&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })))&nbsp; &nbsp; .GetStringAsync();您可以传递与WithClient()默认客户端不同的客户端配置。在某些情况下,您不想更改默认客户端,而是应用属性,例如仅针对此特定情况的证书验证。
随时随地看视频慕课网APP
我要回答