在 NLB 群集中通过 AMQP 向 Windows 服务器的服务总线发送消息
Sending messages to Service Bus for Windows Server via AMQP in a NLB cluster
当通过 AMQP 连接到我们的负载平衡服务总线实例时,我们无法将消息发送到队列或主题。
我们在 Hyper-V 上的虚拟机中有一个 Windows Server 2012 R2,运行。该服务器是 NLB 群集的一部分(当前仅包含此单个主机)。在服务器上,我们为 Windows Server 1.1 安装了服务总线,并使用以下 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
- Public 密钥:RSA(2048 位)
- 主题:O = 公司,CN = 公司 CA
- 基本约束:主题类型= CA,路径长度约束= None
- 密钥用法:证书签名、离线 CRL 签名、CRL 签名
- 公司部门CA
- 签名算法:sha256RSA
- Public 密钥:RSA(2048 位)
- 颁发者:公司 CA
- 主题:O = 公司,CN = 公司 CA
- 基本约束:主题类型= CA,路径长度约束= None
- 密钥用法:证书签名、离线 CRL 签名、CRL 签名
- sb.department.company.com
- 签名算法:sha256RSA
- Public 密钥:RSA(2048 位)
- 颁发者:公司部CA
- 主题:O = 公司,CN = sb.department.company.com
- 基本约束:主题类型=最终实体,路径长度约束=None
- 密钥用途:数字签名、不可否认性、密钥加密、数据加密
- 增强的密钥用法:服务器身份验证
- 主题备用名称:DNS 名称 = sb.department.company.com
这 3 个证书安装在本地计算机(不是当前用户)的证书存储中:
- 根证书(公司 CA)安装在 受信任的根证书颁发机构。
- 中级证书(公司部门CA)安装在Intermediate Certification Authorities.
- 服务器证书 (sb.department.company.com) 安装在 Trusted People.
当我们使用网络浏览器连接到 https:// sb.department.company.com:9355/namespace 时,我们可以看到证书是正确且可信的。
当我们使用 .NET 库连接到服务总线实例时,我们可以做任何事情(获取 [=102= 的列表]、创建 queues/topics、将消息发送到队列、... ).
当我们在 C++ 应用程序中使用 AMQP 进行连接时(在 Linux 上),我们无法将消息发送到队列。
这可以通过服务总线资源管理器轻松演示:如果我们将传输类型设置为 AMQP,我们会得到这种不稳定的行为。我们可以获得队列和主题的列表,但是在尝试发送消息时,我们收到以下错误消息:Exception: The remote certificate is invalid according to the validation procedure.. Method b__be.
我们如何解决这个问题?
咨询 Microsoft 支持后,我们能够解决该问题。这是问题的简短描述。
- 客户端通过NLB域名连接到服务总线网关(证书验证成功,因为它包含NLB域名)。
- 尝试发送消息时,Service Bus Gateway 将客户端重定向到其中一台服务器上的 Service Bus Message Broker .
- 客户端使用服务器的域名或机器名连接到服务器
- 证书验证失败,因为证书不包含服务器的域名或机器名。
解决方案是在 Subject Alternative Names 属性 的证书。
当通过 AMQP 连接到我们的负载平衡服务总线实例时,我们无法将消息发送到队列或主题。
我们在 Hyper-V 上的虚拟机中有一个 Windows Server 2012 R2,运行。该服务器是 NLB 群集的一部分(当前仅包含此单个主机)。在服务器上,我们为 Windows Server 1.1 安装了服务总线,并使用以下 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
- Public 密钥:RSA(2048 位)
- 主题:O = 公司,CN = 公司 CA
- 基本约束:主题类型= CA,路径长度约束= None
- 密钥用法:证书签名、离线 CRL 签名、CRL 签名
- 公司部门CA
- 签名算法:sha256RSA
- Public 密钥:RSA(2048 位)
- 颁发者:公司 CA
- 主题:O = 公司,CN = 公司 CA
- 基本约束:主题类型= CA,路径长度约束= None
- 密钥用法:证书签名、离线 CRL 签名、CRL 签名
- sb.department.company.com
- 签名算法:sha256RSA
- Public 密钥:RSA(2048 位)
- 颁发者:公司部CA
- 主题:O = 公司,CN = sb.department.company.com
- 基本约束:主题类型=最终实体,路径长度约束=None
- 密钥用途:数字签名、不可否认性、密钥加密、数据加密
- 增强的密钥用法:服务器身份验证
- 主题备用名称:DNS 名称 = sb.department.company.com
这 3 个证书安装在本地计算机(不是当前用户)的证书存储中:
- 根证书(公司 CA)安装在 受信任的根证书颁发机构。
- 中级证书(公司部门CA)安装在Intermediate Certification Authorities.
- 服务器证书 (sb.department.company.com) 安装在 Trusted People.
当我们使用网络浏览器连接到 https:// sb.department.company.com:9355/namespace 时,我们可以看到证书是正确且可信的。
当我们使用 .NET 库连接到服务总线实例时,我们可以做任何事情(获取 [=102= 的列表]、创建 queues/topics、将消息发送到队列、... ).
当我们在 C++ 应用程序中使用 AMQP 进行连接时(在 Linux 上),我们无法将消息发送到队列。 这可以通过服务总线资源管理器轻松演示:如果我们将传输类型设置为 AMQP,我们会得到这种不稳定的行为。我们可以获得队列和主题的列表,但是在尝试发送消息时,我们收到以下错误消息:Exception: The remote certificate is invalid according to the validation procedure.. Method b__be.
我们如何解决这个问题?
咨询 Microsoft 支持后,我们能够解决该问题。这是问题的简短描述。
- 客户端通过NLB域名连接到服务总线网关(证书验证成功,因为它包含NLB域名)。
- 尝试发送消息时,Service Bus Gateway 将客户端重定向到其中一台服务器上的 Service Bus Message Broker .
- 客户端使用服务器的域名或机器名连接到服务器
- 证书验证失败,因为证书不包含服务器的域名或机器名。
解决方案是在 Subject Alternative Names 属性 的证书。