通过NLB群集中的AMQP将消息发送到Service Server for Windows Server

时间:2015-02-03 13:22:33

标签: amqp servicebus windows-server-2012-r2 nlb

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

我们有一台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 生成证书,但这些证书没有使用者替代名称属性。作为此问题的解决方案,我们使用 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)安装在受信任的根证书颁发机构中。
  • 中间证书(公司部门CA)安装在中级证书颁发机构中。
  • 服务器证书(sb.department.company.com)安装在受信任的人中。

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

当我们使用.NET库连接到Service Bus实例时,我们可以做所有事情(获取队列/主题列表,创建队列/主题,将消息发送到队列,......)。

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

我们如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

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

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