【Azure 服务总线】使用Azure Service Bus 时,出现证书错误: 所使用的证书具有无法验证的信任链

证书,信任链,Bus ,总线 · 浏览次数 : 124

小编点评

**问题:** 在Azure中连接Service Bus服务发送消息时发生证书错误,抛出证书异常消息: ``` The X.509 certificate CN=servicebus.chinacloudapi.cn, OU=Azure, O=Shanghai Blue Cloud Technology Co Ltd, L=Shanghai, S=Shanghai, C=CN is not in the trusted people store. The X.509 certificate CN=servicebus.chinacloudapi.cn, OU=Azure, O=Shanghai Blue Cloud Technology Co Ltd, L=Shanghai, S=Shanghai, C=CN chain building failed. The certificate that was used has a trust chain that cannot be verified. Replace the certificate or change the certificateValidationMode. ``` **解决方案:** 1. **强制使用HTTPS模式连接 Service Bus服务:** ```csharp string connectionString = "servicebus connection string"; ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.Httpsvar; namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString); if (!namespaceManager.TopicExists("TestTopic")) { namespaceManager.CreateTopic("TestTopic"); } TopicClient client = TopicClient.CreateFromConnectionString(connectionString, "TestTopic"); BrokeredMessage testMessage = new BrokeredMessage("test message"); testMessage.MessageId = "message id"; client.Send(testMessage); ``` 2. **升级Service Bus SDK代码:** 建议将代码升级到最新的Service Bus SDK版本,使用新的AMQP协议连接Service Bus。 3. **设置证书验证模式:** 可以在Service Bus客户端设置证书验证模式以强制验证证书链的有效性。例如: ```csharp // Set the certificate validation mode to PeerTrust client.Client.SetTrustStore(null, "MyTrustStore.pfx"); ``` 4. **在消息发送时使用HTTPS连接:** 可以使用`TransportType`设置`ServiceBusTransportType.AmqpWebSockets`以强制使用HTTPS连接。

正文

问题描述

在Azure中连接 Service Bus 服务发送消息时发生证书错误,抛出证书异常消息:

The X.509 certificate CN=servicebus.chinacloudapi.cn, OU=Azure, O=Shanghai Blue Cloud Technology Co Ltd, L=Shanghai, S=Shanghai, C=CN is not in the trusted people store. 
The X.509 certificate CN=servicebus.chinacloudapi.cn, OU=Azure, O=Shanghai Blue Cloud Technology Co Ltd, L=Shanghai, S=Shanghai, C=CN chain building failed. 
The certificate that was used has a trust chain that cannot be verified. 
Replace the certificate or change the certificateValidationMode. 
A certificate chain could not be built to a trusted root authority.

 

 

问题解答

如果在连接Service Bus的代码中不对 ConnectivityMode 做预先设置,Service Bus SDK默认使用了 AutoDetect 模式 连接 Service Bus 服务。 

AutoDetect 会优先使用 TCP 连接模式,由于 TCP 连接模式也是加密的,所以客户端需要首先验证 service bus 服务器证书 CN = servicebus.chinacloudapi.cn 的有效性,证书链信息在 SSL 协议的 server hello 消息中返回。

如果证书链中的某些中间证书没有安装在 web 应用实例上,web 应用需要发起额外的请求到 CA 服务器上下载中间证书并安装。当下面任何一种情况发生时,web 应用无法对 service bus 服务器证书建立信任的证书链,随后会报告上述的证书错误:

  1. 运行Service Bus客户端代码的实例和 CA 服务器之间存在网络问题,导致无法下载证书.
  2. 运行Service Bus客户端代码的实例无法成功安装证书,如权限问题等。

推荐在代码中强制使用 HTTPS 模式连接 Service Bus 服务,HTTPS 模式有不同的设计,因此会很大程度上避免上述错误发生。

示例代码如下:

string connectionString = "servicebus connection string";

ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.Https

var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);

if (!namespaceManager.TopicExists("TestTopic"))
{
    namespaceManager.CreateTopic("TestTopic");
}

TopicClient client = TopicClient.CreateFromConnectionString(connectionString, "TestTopic");

BrokeredMessage testMessage = new BrokeredMessage("test message");
testMessage.MessageId = "message id";

client.Send(testMessage);

另外,以上代码代码使用很旧的Service Bus SDK,强烈建议升级SDK代码,使用新的AMQP协议连接Service Bus

using Azure.Messaging.ServiceBus;

// the client that owns the connection and can be used to create senders and receivers
ServiceBusClient client;
// The Service Bus client types are safe to cache and use as a singleton for the lifetime
// of the application, which is best practice when messages are being published or read
// regularly.
//
// set the transport type to AmqpWebSockets so that the ServiceBusClient uses the port 443. 
// If you use the default AmqpTcp, you will need to make sure that the ports 5671 and 5672 are open

// TODO: Replace the <NAMESPACE-CONNECTION-STRING> and <QUEUE-NAME> placeholders
var clientOptions = new ServiceBusClientOptions()
{ 
    TransportType = ServiceBusTransportType.AmqpWebSockets
};
client = new ServiceBusClient("<NAMESPACE-CONNECTION-STRING>", clientOptions); 

 

 

参考文档

添加将消息发送到队列的代码  : https://learn.microsoft.com/zh-cn/azure/service-bus-messaging/service-bus-dotnet-get-started-with-queues?tabs=passwordless#add-code-to-send-messages-to-the-queue 

 

与【Azure 服务总线】使用Azure Service Bus 时,出现证书错误: 所使用的证书具有无法验证的信任链相似的内容:

【Azure 服务总线】使用Azure Service Bus 时,出现证书错误: 所使用的证书具有无法验证的信任链

问题描述 在Azure中连接 Service Bus 服务发送消息时发生证书错误,抛出证书异常消息: 或 The X.509 certificate CN=servicebus.chinacloudapi.cn, OU=Azure, O=Shanghai Blue Cloud Technology

【Azure 服务总线】Azure.Messaging.ServiceBus 多次发送消息报超时错误,是否可以配置重新发送?是否有内置重试机制?

问题描述 使用 Azure Service Bus,提供应用程序之间松耦合的消息交换,但是有时候发送消息多次出现超时错误。 A connection attempt failed because the connected party did not properly respond after a

【Azure 服务总线】查看Service Bus中消息多次发送的日志信息,消息是否被重复消费

问题描述 使用Service Bus,发现消息被重复消费。如果要查看某一条消息的具体消费情况,需要那些消息的属性呢? 问题解答 使用Azure Service Bus,当消费发送到服务端后,就会生产相关属性,如Partition Key,Message ID,Enqueued Time, Seque

【Azure 服务总线】Azure门户获取ARM模板,修改Service Bus的TLS版本

问题描述 在Azure中创建Sverice Bus服务后,如果想修改服务的TLS版本,是否有办法呢? 问题解答 通过Service Bus的ARM模板,修改属性值中的 minimumTlsVersion,可以设置Service Bus服务最低支持的TLS版本,如1.0, 1.1, 1.2 操作步骤为

【Azure 服务总线】如何批量删除Azure Service Bus中的Topics(数量较多,需要过滤后批量删除)

问题描述 Azure Service Bus 的门户操作页面上,是否可以批量删除其中的Topics呢? 问题解答 Azure Service Bus门户或Service Bus Explorer工具没有提供批量删除Topic的方法。但是可以自己写脚本删除,并且可以在删除的时候自定义过滤条件。 以Py

【Azure 云服务】为Azure云服务配置上自签名的SSL证书步骤

问题描述 在使用Azure Cloud Service(云服务),默认的情况下都是使用的 HTTP 服务,通过 Visual Studio 2022 创建的默认 Cloud Service项目中,在ServiceDefinition.csdef 服务定义文件中,值默认开启了HTTP 80的Endpo

【Azure Key Vault】Key Vault能不能生成DigiCert证书?能不能自动 Rotate 证书呢?

问题描述 因为Azure Key Vault服务上保管的证书可以轻松的与其他Azure服务集成使用,所以需要知道 Key Vault 能不能生成 DigiCert 证书?能不能自动 Rotate 证书呢? 问题解答 Azure Key Vault本身只是一个保管库,它不会颁发证书。但是可以在页面上直

Azure Service Principals ----- Azure 上最好保守的秘密的服务

一,引言 Azure Service Principals 是 Azure Active Directory (AAD) 中的一种标识,代表应用程序,服务,自动化流程。Service Principals 支持各种 Azure 服务和资源之家的安全通信,为应用程序提供了一种进行身份验证并于 Azur

【Azure 媒体服务】Media Service的编码示例 -- 创建缩略图子画面的.NET代码调试问题

Azure.Identity.AuthenticationFailedException: 'ClientSecretCredential authentication failed: AADSTS90002: Tenant '********-****-****-****-************' not found. Check to make sure you have the corre

【Azure 云服务】Cloud Service Worker Role Workerrole突然停机,查看Events发现 Defrag Error (0x8900002D)

问题描述 Cloud Service Worker Role Workerrole突然停机,查看Events,发现是错误源为 Defrag。 错误消息: The volume Windows was not optimized because an error was encountered: Ne