Flurl 和不受信任的证书
Flurl and untrusted certificates
目前我在 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
你有这个问题吗?
谢谢!
这是我对 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 客户端进行调用,如我的代码中所示。用法与 URL.
的 Flurl 扩展相同
最典型的方法是 create a custom factory:
public class UntrustedCertClientFactory : DefaultHttpClientFactory
{
public override HttpMessageHandler CreateMessageHandler() {
return new HttpClientHandler {
ServerCertificateCustomValidationCallback = (_, _, _, _) => true
};
}
}
然后在您的应用程序启动的某处注册它:
FlurlHttp.ConfigureClient("https://theapi.com", cli =>
cli.Settings.HttpClientFactory = new UntrustedCertClientFactory());
Flurl 默认为每个主机重用相同的 HttpClient
实例,因此以这种方式配置意味着每次调用 theapi.com
都将允许使用不受信任的证书。与将 HttpClient
传递给 FlurlClient
构造函数相比,这样做的优势在于,它可以将此配置“放在一边”,并在您以更 typical/less 详细的方式使用 Flurl 时起作用:
await "https://theapi.com/endpoint".GetJsonAsync();
接受任何证书的内联解决方案是:
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()
您可以传递与默认客户端配置不同的客户端。在某些情况下,您不想更改默认客户端,而是应用属性,例如证书验证仅针对此特定案例。
目前我在 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 你有这个问题吗?
谢谢!
这是我对 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 客户端进行调用,如我的代码中所示。用法与 URL.
最典型的方法是 create a custom factory:
public class UntrustedCertClientFactory : DefaultHttpClientFactory
{
public override HttpMessageHandler CreateMessageHandler() {
return new HttpClientHandler {
ServerCertificateCustomValidationCallback = (_, _, _, _) => true
};
}
}
然后在您的应用程序启动的某处注册它:
FlurlHttp.ConfigureClient("https://theapi.com", cli =>
cli.Settings.HttpClientFactory = new UntrustedCertClientFactory());
Flurl 默认为每个主机重用相同的 HttpClient
实例,因此以这种方式配置意味着每次调用 theapi.com
都将允许使用不受信任的证书。与将 HttpClient
传递给 FlurlClient
构造函数相比,这样做的优势在于,它可以将此配置“放在一边”,并在您以更 typical/less 详细的方式使用 Flurl 时起作用:
await "https://theapi.com/endpoint".GetJsonAsync();
接受任何证书的内联解决方案是:
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()
您可以传递与默认客户端配置不同的客户端。在某些情况下,您不想更改默认客户端,而是应用属性,例如证书验证仅针对此特定案例。