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

Linux下.NET Core应用对接Service Bus for Windows Server 1.1证书错误排查

解决Service Bus for Windows Server 1.1与Microsoft.Azure.ServiceBus包的证书验证错误

我之前踩过一模一样的坑!你这个问题的核心原因很明确:本地部署的Service Bus for Windows Server 1.1默认使用自签名证书,而.NET Core的默认证书验证逻辑不会信任这种非权威机构签发的证书——对接Azure云服务总线时用的是微软官方可信证书,所以没毛病,但本地版本就触发了认证异常。

给你几个可行的解决思路,按需选择:

1. 测试环境临时绕过证书验证(别在生产用!)

如果只是做本地测试,想快速跑通代码,可以在初始化Service Bus客户端前加一段代码跳过证书检查:

// 警告:仅用于测试环境,生产环境绝对禁用,会带来严重安全风险!
System.Net.ServicePointManager.ServerCertificateValidationCallback +=
    (sender, certificate, chain, sslPolicyErrors) => true;

这段代码会让应用忽略所有HTTPS证书的验证错误,虽然能快速解决问题,但相当于给系统开了个安全口子,生产环境绝对不能用。

2. 将本地Service Bus证书导入Linux系统信任根(推荐生产环境)

这是最规范的生产环境解决方案,让Linux系统信任Service Bus的自签名证书:

  • 第一步:导出Service Bus证书
    在Service Bus服务器上,打开「本地计算机证书存储」(可以通过certlm.msc打开),找到个人 > 证书里主题为你的Service Bus服务器名称的证书,右键选择「所有任务 > 导出」,选择Base64编码的X.509格式(.cer文件)保存。
  • 第二步:在Linux客户端导入证书
    根据你的Linux发行版执行对应命令:
    • Debian/Ubuntu系:
      sudo cp your-servicebus-cert.cer /usr/local/share/ca-certificates/
      sudo update-ca-certificates
      
    • RHEL/CentOS系:
      sudo cp your-servicebus-cert.cer /etc/pki/ca-trust/source/anchors/
      sudo update-ca-trust extract
      
  • 第三步:重启你的.NET Core应用
    证书导入后需要重启应用,让新的信任配置生效。

3. 仅让应用信任该证书(适合无法修改系统存储的场景)

如果没有权限修改Linux系统的证书存储,可以在应用代码里手动加载并信任Service Bus的证书:

// 加载Service Bus的证书文件
var trustedCert = new X509Certificate2("/path/to/your-servicebus-cert.cer");

// 创建自定义HTTP客户端处理器,只信任指定证书
var handler = new HttpClientHandler();
handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) =>
{
    // 要么证书无错误,要么是我们信任的那个证书(通过指纹匹配)
    return errors == SslPolicyErrors.None || cert.Thumbprint == trustedCert.Thumbprint;
};

// 初始化ServiceBusClient时传入自定义配置
var clientOptions = new ServiceBusClientOptions
{
    TransportType = ServiceBusTransportType.AmqpTcp, // 根据你的实际传输协议调整
    ConnectionFactory = new AmqpConnectionFactory(new AmqpTransportSettings
    {
        HttpClientHandler = handler
    })
};

var serviceBusClient = new ServiceBusClient(yourConnectionString, clientOptions);

这种方式只会让你的应用信任特定的Service Bus证书,不会影响系统其他应用,安全性更高。

另外再提两个注意点:

  • 确保你创建的SAS授权规则权限正确:如果是发送消息就给「发送」权限,接收就给「监听」权限,或者直接给「管理」权限(测试用)。
  • 检查连接字符串格式:本地Service Bus的连接字符串应该是Endpoint=sb://your-server-name/;SharedAccessKeyName=your-key-name;SharedAccessKey=your-key-value,不要带Azure云环境的额外参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:26:03