Xamarin Android 问题通过 HTTPS 连接到具有自签名证书的站点:“未找到证书路径的信任锚。”

Posted

技术标签:

【中文标题】Xamarin Android 问题通过 HTTPS 连接到具有自签名证书的站点:“未找到证书路径的信任锚。”【英文标题】:Xamarin Android issue connecting via HTTPS to site with self-signed certificate: "Trust anchor for certification path not found." 【发布时间】:2019-02-15 18:40:43 【问题描述】:

我正在尝试对具有 2 个 SSL 证书的站点进行 HTTPS 调用:一个自签名证书和一个由第一个证书签名的证书。当我使用 HttpClient 向站点发送请求时,控制台会记录一个不受信任的链,显示两个证书,然后打印由 java.security.cert.CertPathValidatorException: Trust anchor for certification path not found 引起的长堆栈跟踪。

我已在我的手机上安装了这两个证书,并且将 Chrome 导航到该站点显示一个受信任的连接(在我安装证书之前它有一个不受信任的连接警告)。我认为问题在于应用程序拒绝信任自签名证书。我无权访问服务器,因此对其证书没有影响,因此安装由受信任的 CA 签名的证书是不可行的。


我尝试过但没有奏效的解决方案。

ServicePointManager.ServerCertificateValidationCallback 似乎没有运行。

我尝试使用我自己的函数来处理ServicePointManager.ServerCertificateValidationCallback,但我给它的委托似乎从未运行。我的 MainActivity.OnCreate 方法中有以下代码,但控制台从不记录消息:

System.Net.ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>

  Console.WriteLine($"****************************************************************************************************");

  return true;
;

HttpClientHandler.ServerCertificateCustomValidationCallback 抛出异常。

我曾尝试使用HttpClientHandler 并设置它的ServerCertificateCustomValidationCallback,但我只是收到消息:

System.NotImplementedException: The method or operation is not implemented. at System.Net.Http.HttpClientHandler.set_ServerCertificateCustomValidationCallback (System.Func`5[T1,T2,T3,T4,TResult] value).

设置代码:

HttpClientHandler handler = new HttpClientHandler();
handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true;
HttpClient client = new HttpClient(handler);

【问题讨论】:

您使用的是托管提供程序还是 androidClientHandler 和/或哪个 SSL/TLS:BoringSSL 或托管? 我只是使用带有默认设置的常规HttpClient(除非我尝试使用 HttpClientHandler)。 我正在寻找项目的 Android 构建设置(项目选项/构建/Android 构建/常规选项卡),如果您仍然可以使用托管提供程序,请使用 AndroidClientHandler 和 clean/rebuild/重新测试 HttpClient 实现:Android。 SSL/TLS 实施:本机 TLS 1.2+。我将 HttpClient 实现更改为 Managed,当我尝试调用时得到异常 System.Net.WebException: Unable to read data from the transport connection: Connection reset by peer. 还有 SSL/TLS 设置? 【参考方案1】:

我能够让它同时在 Android 和 ios 上运行。

iOS 很简单,只需覆盖 ServicePointManager.ServerCertificateValidationCallback:

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

对于 Android 我使用了 Bruno Caceiro's answer from a similar question 和创建的依赖服务。

在我的 Xamarin Forms 项目中,我添加了一个简单的界面:

public interface IHTTPClientHandlerCreationService

  HttpClientHandler GetInsecureHandler();

在我的 Xamarin Android 项目中,我实现了接口:

[assembly: Dependency(typeof(HTTPClientHandlerCreationService_Android))]
namespace MyApp.Droid

  public class HTTPClientHandlerCreationService_Android : CollateralUploader.Services.IHTTPClientHandlerCreationService
  
    public HttpClientHandler GetInsecureHandler()
    
      return new IgnoreSSLClientHandler();
    
  

  internal class IgnoreSSLClientHandler : AndroidClientHandler
  
    protected override SSLSocketFactory ConfigureCustomSSLSocketFactory(HttpsURLConnection connection)
    
      return SSLCertificateSocketFactory.GetInsecure(1000, null);
    

    protected override IHostnameVerifier GetSSLHostnameVerifier(HttpsURLConnection connection)
    
      return new IgnoreSSLHostnameVerifier();
    
  

  internal class IgnoreSSLHostnameVerifier : Java.Lang.Object, IHostnameVerifier
  
    public bool Verify(string hostname, ISSLSession session)
    
      return true;
    
  

共享代码正确设置 HttpClient:

switch (Device.RuntimePlatform)

  case Device.Android:
    this.httpClient = new HttpClient(DependencyService.Get<Services.IHTTPClientHandlerCreationService>().GetInsecureHandler());
    break;
  default:
    ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
    this.httpClient = new HttpClient(new HttpClientHandler());
    break;

【讨论】:

你在哪里写这个代码它让我编译器错误!! 这对我有用。优秀的回复。谢谢你的回答。 可能在Android项目的MainActivity.cs文件中 我收到此警告:“SSLCertificateSocketFactory.GetInsecure(int, SSLSessionCache)”已过时:“已弃用”。同样对于加载图像,此解决方案似乎不起作用。只有 JSON 调用有效。 我遵循了这个解决方案,但仍然得到错误 Trust anchor for certificate path not found。我是否需要在测试设备上安装证书才能正常工作?如果是这样,有人会告诉我怎么做吗?此解决方案仅适用于自签名证书吗?实际证书怎么样?

以上是关于Xamarin Android 问题通过 HTTPS 连接到具有自签名证书的站点:“未找到证书路径的信任锚。”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 xamarin android 中修复“不允许到 x 的明文 HTTP 流量”

Android(Xamarin)如何通过蓝牙从手环获取数据(脉冲)

从 url/http 下载并打开图片 [Android Xamarin App]

Visual Studio中的Android文档

通过 Xamarin.Facebook.Android sdk 登录 Facebook

通过 FireBase 触发从 ASP.Net Api 到 Xamarin.Android 应用程序的推送通知