Xamarin:过期的Let's Encrypt证书和HttpClient

bejyjqdl  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(136)

最近我的Xamarin应用程序停止工作,因为HttpClient的GetAsync方法开始抛出异常“无法建立SSL连接”。内部异常是“SSL错误:1000007d:SSL例程:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED”。
我请求的站点使用ISRG Root X1证书。我设备上的Android 11是最新的,所有浏览器都成功打开请求的URI。站点https://expired-r3-test.scotthelme.co.uk/也说一切正常。
为什么HttpClient现在抛出异常?有办法在我的设备上修复此问题吗?

f87krz0w

f87krz0w1#

我做了一些调查,首先,我从official site安装了ISRG Root X1证书,它没有帮助。
然后我添加了我自己的HttpClientHandler.ServerCertificateCustomValidationCallback,在HttpClient.getAsync调用工作的Windows 7中,通过参数传递的证书链是正确的:* globusenergo.ru-〉R3-〉ISRG根目录X1 .
在Android链中包含过时的DST Root CA X3证书:
globusenergo.ru-〉R3-〉ISRG根目录X1-〉DST根目录CA X3 *。
此外,我尝试了HttpClient和SSL/TLS实现的不同组合,如here所述。没有帮助。
很可能是Xamarin Mono问题据我所知,BoringSsl使用自己证书存储
因此,如果您是站点的所有者,则应更新证书。证书必须包含正确的链,且不引用过期的DST Root CA X3。如果您正在开发应用程序并信任该站点,则可以使用以下代码避免证书验证:

httpClientHandler.ServerCertificateCustomValidationCallback +=
    (sender, cert, chain, sslPolicyErrors) => true;
    • 更新**问题出在HttpClientHandler类,而不是Xamarin Mono。我在HttpClient构造函数中指定了该类的一个示例作为参数。如果您使用本机AndroidClientHandler,问题就会消失。
wz8daaqr

wz8daaqr2#

关于正确设置HttpClient on Android项目(即Xamarin.Android或Uno Platform Droid)的所有信息可以在这里找到:HttpClient Stack and SSL/TLS Implementation Selector for Android
在Uno平台Droid中,我尝试了两种解决方案(更改Droid项目属性上的设置并实现AndroidClientHandler),两种方案都能正确工作。

相关问题