为了账号安全,请及时绑定邮箱和手机立即绑定

Flurl 和不受信任的证书

Flurl 和不受信任的证书

C#
浮云间 2022-06-19 10:27:17
目前我在 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 你有这个问题的问题吗?谢谢!
查看完整描述

3 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

最典型的方法是创建一个自定义工厂:


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();


查看完整回答
反对 回复 2022-06-19
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

这是我对 Flurl 的设置,它适用于不受信任的证书:


HttpClientHandler httpClientHandler = new HttpClientHandler();

httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, 

  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 扩展相同网址。


查看完整回答
反对 回复 2022-06-19
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

接受任何证书的内联解决方案是:



var myString = await "https://some-server-with-an-invalid-cert.net"

    .AppendPathSegment("/some-file.txt")

    .WithClient(new FlurlClient(new HttpClient(new HttpClientHandler

              {

                  ServerCertificateCustomValidationCallback = (message, cert, chain,

                                                               errors) => true

              })))

    .GetStringAsync();

您可以传递与WithClient()默认客户端不同的客户端配置。在某些情况下,您不想更改默认客户端,而是应用属性,例如仅针对此特定情况的证书验证。


查看完整回答
反对 回复 2022-06-19
  • 3 回答
  • 0 关注
  • 489 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信