1

通过 AMQP 连接到负载均衡的服务总线实例时,我们无法将消息发送到队列或主题。

我们有一个 Windows Server 2012 R2,在 Hyper-V 上的 VM 中运行。该服务器是 NLB 集群的一部分(当前仅包含这台主机)。在服务器上,我们为 Windows Server 1.1 安装了 Service Bus,并使用以下 PowerShell 脚本配置了场、主机和命名空间:

$machineName = 'server'
$domainName = 'sb.department.company.com' # this DNS name is linked to the virtual IP address of the NLB cluster
$namespace = 'namespace'

New-SBFarm -SBFarmDBConnectionString "Data Source=$machineName;Integrated Security=True" -FarmDns $domainName -EncryptionCertificateThumbprint $certThumbprint -FarmCertificateThumbprint $certThumbprint -RunAsAccount $accountName

Add-SBHost -SBFarmDBConnectionString "Data Source=$machineName;Integrated Security=True" -EnableFirewallRules $true -RunAsPassword $securePassword -ExternalBrokerUrl "sb://$domainName"

New-SBNamespace -Name $namespace -AddressingScheme 'Path' -ManageUsers $userGroupName

首先,我们尝试使用makecert生成证书,但这些证书没有Subject Alternative Name属性。作为该问题的解决方案,我们使用OpenSSL来生成我们的证书。这是我们使用的证书链:

  • 公司 CA
    • 签名算法:sha256RSA
    • 公钥:RSA(2048 位)
    • 主题:O = 公司,CN = 公司 CA
    • 基本约束:主题类型 = CA,路径长度约束 = 无
    • 密钥用法:证书签名、离线 CRL 签名、CRL 签名
  • 公司部门 CA
    • 签名算法:sha256RSA
    • 公钥:RSA(2048 位)
    • 发行人:CA公司
    • 主题:O = 公司,CN = 公司 CA
    • 基本约束:主题类型 = CA,路径长度约束 = 无
    • 密钥用法:证书签名、离线 CRL 签名、CRL 签名
  • sb.department.company.com
    • 签名算法:sha256RSA
    • 公钥:RSA(2048 位)
    • 发行人:CA 公司部
    • 主题:O = 公司,CN = sb.department.company.com
    • 基本约束:主题类型 = 结束实体,路径长度约束 = 无
    • 密钥用法:数字签名、不可否认性、密钥加密、数据加密
    • 增强的密钥用法:服务器身份验证
    • 主题备用名称:DNS 名称 = sb.department.company.com

这 3 个证书安装在本地计算机(不是当前用户)的证书存储中:

  • 根证书(公司 CA)安装在Trusted Root Certification Authorities中。
  • 中间证书(Company Department CA)安装在Intermediate Certification Authorities中。
  • 服务器证书 (sb.department.company.com) 安装在Trusted People中。

当我们使用网络浏览器连接到 https://sb.department.company.com:9355/namespace 时,我们可以看到证书是正确且可信的。

当我们使用 .NET 库连接到服务总线实例时,我们可以做任何事情(获取队列/主题列表、创建队列/主题、向队列发送消息……)。

当我们在 C++ 应用程序(在 Linux 上)中使用 AMQP 进行连接时,我们无法将消息发送到队列。这可以通过 Service Bus Explorer 轻松演示:如果我们将传输类型设置为 AMQP,我们会得到这种不稳定的行为。我们可以获得队列和主题的列表,但是在尝试发送消息时,我们会收到以下错误消息:异常:根据验证程序,远程证书无效。方法 b__be

我们如何解决这个问题?

4

1 回答 1

0

在咨询 Microsoft 支持后,我们能够解决该问题。这是问题的简短描述。

  • 客户端通过 NLB 域名连接到Service Bus Gateway(证书验证成功,因为它包含 NLB 域名)。
  • 尝试发送消息时,服务总线网关将客户端重定向到其中一台服务器上的服务总线消息代理
  • 客户端使用服务器的域名或机器名连接到服务器。
  • 证书验证失败,因为证书不包含服务器的域名或机器名。

解决方案是在证书的主题备用名称属性中包含场中所有服务器的域名(或机器名称,如果不在域中) 。

于 2015-03-18T13:58:25.363 回答