You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Forms使用Microsoft.Datasync.Client遇SSL连接错误求助

SSL连接失败问题排查与解决

问题核心

开发Xamarin Forms应用,搭配ASP.NET Core WebAPI,使用Microsoft.Datasync.Client和Microsoft.AspNetCore.Datasync实现离线同步时,调用远程表的ToListAsync()方法触发SSL连接错误:

"The SSL connection could not be established, see inner exception."

内部关键异常信息:

Mono.Btls.MonoBtlsException: Ssl error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED

浏览器、Postman调用服务无证书问题,切换至带有效SSL证书的开发服务器后问题依旧。

涉事代码片段

private async Task InitializeOfflineStore()
{
    try
    {
        string serviceUri = "https://10.0.2.2";
        var tableName = "TodoItem";

        var options = new DatasyncClientOptions
        {
            IdGenerator = (table) => Guid.NewGuid().ToString("N"),
            InstallationId = null,
            OfflineStore = null,
            ParallelOperations = 1,
            SerializerSettings = null,
            TableEndpointResolver = (table) => $"/tables/{tableName.ToLowerInvariant()}",
            UserAgent = $"Datasync/5.0 (/* Device information */)"
        };

        var client = new DatasyncClient(serviceUri, options);

        IRemoteTable<TodoItem> remoteTable = client.GetRemoteTable<TodoItem>();

        List<TodoItem> items = await remoteTable.ToListAsync(); // 错误触发位置

        foreach (var item in items)
        {
            Console.WriteLine("###############" + item.Title);
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("################### Error: " + ex.Message);
    }
}

原因分析

Xamarin基于Mono运行时,其证书信任机制与浏览器、Postman存在差异:

  1. 本地开发证书未被Xamarin应用的信任存储收录
  2. 证书的通用名称(CN)或主题备用名称(SAN)不包含10.0.2.2这个访问IP
  3. Mono的根证书库未包含证书颁发机构(CA)
  4. Datasync Client默认使用的HttpClient未配置自定义证书验证逻辑

解决方案

1. 开发环境临时验证(仅测试用,禁止生产环境)

临时绕过证书验证,确认问题根源:

// 添加自定义HttpClientHandler
var handler = new HttpClientHandler();
// 跳过证书验证,仅开发阶段使用
handler.ServerCertificateCustomValidationCallback = (msg, cert, chain, errors) => true;

// 传入自定义handler创建DatasyncClient
var client = new DatasyncClient(serviceUri, handler, options);

2. 开发环境正规配置(推荐)

步骤1:修正证书的SAN字段

如果使用ASP.NET Core开发证书,需将10.0.2.2添加到证书的主题备用名称(SAN)中。可通过PowerShell生成包含指定IP的自签名证书,替换原有开发证书。

步骤2:将证书导入设备信任存储

  • Android模拟器:将证书文件(.cer格式)拖入模拟器,按提示完成安装并设置信任。
  • iOS模拟器:在Mac的钥匙串访问中导入证书,设置为「始终信任」,重启模拟器生效。

步骤3:配置Datasync Client信任指定证书

针对自签名证书,在HttpClientHandler中添加精准验证逻辑:

// 从应用资源读取证书文件
byte[] certBytes = await File.ReadAllBytesAsync("dev-cert.cer");
X509Certificate2 trustedCert = new X509Certificate2(certBytes);

var handler = new HttpClientHandler();
handler.ServerCertificateCustomValidationCallback = (msg, cert, chain, errors) => {
    // 验证服务器证书是否为信任的证书
    return errors == SslPolicyErrors.None || cert.Thumbprint == trustedCert.Thumbprint;
};

var client = new DatasyncClient(serviceUri, handler, options);

3. 生产环境解决方案

  • 使用正规CA颁发的SSL证书,确保证书的CN/SAN与生产域名完全匹配
  • 依赖设备/系统默认信任的根证书库(正规CA根证书通常已被收录)
  • 禁止使用任何证书绕过逻辑,保障通信安全

额外检查项

  • 确认serviceUri包含正确端口:ASP.NET Core开发服务器默认HTTPS端口为5001,完整地址应为https://10.0.2.2:5001
  • 在模拟器浏览器中访问https://10.0.2.2:5001/tables/TodoItem,确认网络连通性和证书是否被识别

内容的提问来源于stack exchange,提问作者Tony Fox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 13:47:04