访问 Azure 服务总线队列的 SSIS 脚本任务抛出 X.509 证书错误
SSIS Script Task accessing Azure Service Bus queue throws X.509 certificate error
我有一个 SSIS 包,其中包含一个脚本任务,可将消息放置在 Azure 服务总线上。 SSIS 包在 MS SQL Server 2014 上 运行,在带有 Windows Server 2012 的 Azure VM 上。这在我的开发机器和我控制的测试 Azure VM 上运行良好。我的客户已将它安装到他们的生产 Azure VM(我无法访问)中,现在它始终生成错误:
The X.509 certificate CN=servicebus.windows.net is not in the trusted people >store. … at Microsoft.ServiceBus.Messaging.MessageSender.OnSend( …
失败的脚本任务代码是:
MessagingFactory factory = MessagingFactory.CreateFromConnectionString(connStr);
MessageSender msgSender = factory.CreateMessageSender(SBQueueName);
msgSender.Send(JsonMsg); // throws the error
在阅读了我在 Whosebug 和 Microsoft 论坛上看到的其他帖子后,我的理解是,第一次运行此代码时,它应该会自动下载并安装所需的证书。显然这没有发生,我怀疑我客户的生产环境中存在配置问题。可能是 SSIS 服务的“NT Service\MsDtsServer120”虚拟帐户权限不足,或者防火墙阻止从 Microsoft 证书颁发机构下载证书。由于虚拟帐户设置了默认访问权限,我猜问题出在防火墙上。允许下载证书所需的可能的防火墙规则更改是什么?还是我怀疑是防火墙问题?
我在其他 Whosebug 帖子中看到了建议的解决方法,包括 1) 将调用连接模式更改为 HTTP 或 HTTPS,或 2) 在 VM 上手动安装证书,但我想更全面地了解这个问题并解决这个问题如果可能,不要诉诸这些解决方法。
I have seen workarounds suggested in other Whosebug posts including 1) changing the calling ConnectionMode to HTTP or HTTPS, or 2) Manually installing the certificate on the VM, but I would like to understand the issue more fully and resolve this without resorting to these workarounds if possible.
原因:
如果我们没有提前设置ConnectivityMode,服务总线客户端将以自动检测模式连接。但是AutoDetect模式会优先使用Tcp连接模式。
因为 Tcp 连接是加密的。所以客户端需要验证服务总线服务器证书CN=servicebus.windows.net
,证书链信息在SSL协议的服务器问候消息中返回。
如果证书链中的部分中间证书没有安装,实例需要向CA服务器发起额外的请求下载中间证书并安装。
当出现以下任何一种情况时,实例无法为服务总线服务器证书建立可信证书链,然后报告上述证书错误。
实例与CA服务器之间存在network problem
,导致无法下载证书
实例无法成功安装证书,例如permissions issues.
解法:
正如您提到的:
我们可以将调用连接模式更改为 HTTPS
ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.Https
在 VM 上手动 installing the certificate
不幸的是,我没有提到该包是由 Powershell 脚本执行的。原来SSIS包继承了执行Powershell脚本的账户权限,不足以安装证书; 运行 作为管理员的 Powershell 脚本解决了这个问题,并且所需的证书( 中级证书颁发机构 > Microsoft IT LTS CA 5(由巴尔的摩 CyberTrust Root 颁发))正确地自行安装。在我弄明白之前,我也尝试了 Tom Sun 的解决方法建议来手动安装证书,确实也有效。
我有一个 SSIS 包,其中包含一个脚本任务,可将消息放置在 Azure 服务总线上。 SSIS 包在 MS SQL Server 2014 上 运行,在带有 Windows Server 2012 的 Azure VM 上。这在我的开发机器和我控制的测试 Azure VM 上运行良好。我的客户已将它安装到他们的生产 Azure VM(我无法访问)中,现在它始终生成错误:
The X.509 certificate CN=servicebus.windows.net is not in the trusted people >store. … at Microsoft.ServiceBus.Messaging.MessageSender.OnSend( …
失败的脚本任务代码是:
MessagingFactory factory = MessagingFactory.CreateFromConnectionString(connStr);
MessageSender msgSender = factory.CreateMessageSender(SBQueueName);
msgSender.Send(JsonMsg); // throws the error
在阅读了我在 Whosebug 和 Microsoft 论坛上看到的其他帖子后,我的理解是,第一次运行此代码时,它应该会自动下载并安装所需的证书。显然这没有发生,我怀疑我客户的生产环境中存在配置问题。可能是 SSIS 服务的“NT Service\MsDtsServer120”虚拟帐户权限不足,或者防火墙阻止从 Microsoft 证书颁发机构下载证书。由于虚拟帐户设置了默认访问权限,我猜问题出在防火墙上。允许下载证书所需的可能的防火墙规则更改是什么?还是我怀疑是防火墙问题?
我在其他 Whosebug 帖子中看到了建议的解决方法,包括 1) 将调用连接模式更改为 HTTP 或 HTTPS,或 2) 在 VM 上手动安装证书,但我想更全面地了解这个问题并解决这个问题如果可能,不要诉诸这些解决方法。
I have seen workarounds suggested in other Whosebug posts including 1) changing the calling ConnectionMode to HTTP or HTTPS, or 2) Manually installing the certificate on the VM, but I would like to understand the issue more fully and resolve this without resorting to these workarounds if possible.
原因:
如果我们没有提前设置ConnectivityMode,服务总线客户端将以自动检测模式连接。但是AutoDetect模式会优先使用Tcp连接模式。
因为 Tcp 连接是加密的。所以客户端需要验证服务总线服务器证书CN=servicebus.windows.net
,证书链信息在SSL协议的服务器问候消息中返回。
如果证书链中的部分中间证书没有安装,实例需要向CA服务器发起额外的请求下载中间证书并安装。
当出现以下任何一种情况时,实例无法为服务总线服务器证书建立可信证书链,然后报告上述证书错误。
实例与CA服务器之间存在
network problem
,导致无法下载证书实例无法成功安装证书,例如
permissions issues.
解法: 正如您提到的:
我们可以将调用连接模式更改为 HTTPS
ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.Https
在 VM 上手动 installing the certificate
不幸的是,我没有提到该包是由 Powershell 脚本执行的。原来SSIS包继承了执行Powershell脚本的账户权限,不足以安装证书; 运行 作为管理员的 Powershell 脚本解决了这个问题,并且所需的证书( 中级证书颁发机构 > Microsoft IT LTS CA 5(由巴尔的摩 CyberTrust Root 颁发))正确地自行安装。在我弄明白之前,我也尝试了 Tom Sun 的解决方法建议来手动安装证书,确实也有效。