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

使用指定证书时YARP出现RemoteCertificateNameMismatch错误的解决问询

问题:Kestrel+YARP网关转发请求时出现RemoteCertificateNameMismatch错误

问题背景

我搭建了基于Kestrel和YARP的API网关应用,配置Kestrel使用从Windows证书库加载的X509Certificate2证书,同时YARP也配置使用该证书。但通过YARP转发请求时,触发RemoteCertificateNameMismatch策略错误。临时通过自定义RemoteCertificateValidationCallback跳过验证,但调试发现sender对象的TargetHostName属性为localhost,而该值不在证书的SAN(Subject Alternative Name)字段中。

错误原因

YARP转发请求到目标地址(如配置中的https://localhost:50781)时,默认会从目标URL提取主机名(此处为localhost)作为SSL证书验证的目标主机名。如果你的证书SAN中未包含localhost,就会触发证书名称不匹配的错误。

正确解决方案

方案1:给证书添加localhost到SAN字段(推荐)

这是最合规的解决方案,确保证书的SAN包含所有需要用于SSL验证的主机名:

  • 打开Windows证书管理器,找到目标证书,右键选择「属性」
  • 切换到「详细信息」标签,找到「使用者可选名称」,确认是否包含localhost
  • 如果没有,可通过PowerShell重新生成证书或修改现有证书,添加DNS名称localhost

方案2:修改YARP目标地址为证书SAN中存在的主机名

将YARP配置文件中的目标地址替换为证书SAN已包含的主机名,同时确保后端服务也绑定到该主机名的证书:

// 修改后的YARP集群配置示例
"clusters": {
  "cluster_infrastructure": {
    "destinations": {
      "destination1": {
        "address": "https://myHostName:50781" // 替换为证书SAN中的主机名
      }
    }
  }
}

方案3:配置YARP HttpClient指定SSL验证的ServerName

如果无法修改证书或目标地址,可通过设置HttpClient的SslOptions.ServerName,强制SSL验证使用证书SAN中存在的主机名,替代从目标URL提取的localhost:

// YARP配置修改
builder.Services
    .AddReverseProxy()
    .LoadFromConfig(builder.Configuration.GetSection("yarp"))
    .ConfigureHttpClient((context, handler) =>
    {
        // 指定证书SAN中存在的主机名,替换为你的实际值
        handler.SslOptions.ServerName = "myHostName";

        handler.SslOptions.ClientCertificates = new X509CertificateCollection
        {
            baseCertificate
        };
    });

此方案无需自定义验证回调,保留了默认的SSL安全验证逻辑,避免绕过安全检查。

不推荐的临时方案说明

之前使用自定义RemoteCertificateValidationCallback通过证书哈希值跳过验证的方式,虽然能临时解决问题,但会绕过SSL证书的名称验证环节,降低了通信的安全性,不建议在生产环境长期使用。

内容的提问来源于stack exchange,提问作者Tom Rieck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:05:20