访问Azure Service Bus队列的SSIS脚本任务会引发X.509证书错误

时间:2018-06-01 15:13:21

标签: ssis client-certificates azure-servicebus-queues

我有一个带有脚本任务的SSIS包,可以在Azure Service Bus上放置一条消息。 SSIS软件包在带有Windows Server 2012的Azure VM上的MS SQL Server 2014上运行。这在我的开发机器和我控制的测试Azure VM中运行良好。我的客户已将其安装到他们的Production Azure VM(我无法访问)中,现在它始终生成错误:

  

X.509证书CN = servicebus.windows.net不在受信任的人>商店中。 ...在Microsoft.ServiceBus.Messaging.MessageSender.OnSend(...

失败的脚本任务代码是:

MessagingFactory factory = MessagingFactory.CreateFromConnectionString(connStr);
MessageSender msgSender = factory.CreateMessageSender(SBQueueName);
msgSender.Send(JsonMsg); // throws the error

在阅读了我在StackOverflow和Microsoft论坛上看过的其他帖子后,我的理解是,这个代码第一次运行它应该下载&自动安装所需的证书。显然这没有发生,我怀疑客户的生产环境中存在配置问题。可能是SSIS服务的“NT Service \ MsDtsServer120”虚拟帐户的权限不足,或者防火墙阻止从Microsoft证书颁发机构下载证书。由于虚拟帐户设置了默认访问权限,我猜测问题是防火墙。允许下载证书所需的防火墙规则更改有哪些?或者我怀疑这是防火墙问题我错了吗?

我见过其他StackOverflow帖子中建议的解决方法,包括1)将调用ConnectionMode更改为HTTP或HTTPS,或2)在VM上手动安装证书,但我想更全面地了解问题并解决此问题而不诉诸如果可能的话,这些解决方法。

2 个答案:

答案 0 :(得分:1)

  

我见过其他StackOverflow帖子中建议的解决方法,包括1)将调用ConnectionMode更改为HTTP或HTTPS,或2)在VM上手动安装证书,但我想更全面地了解问题并解决此问题而不诉诸如果可能的话,这些解决方法。

<强>原因:

如果我们未事先设置 ConnectivityMode ,服务总线客户端将连接AutoDetect模式。但AutoDetect模式将使用Tcp连接模式。

由于Tcp连接已加密。因此,客户端需要验证服务总线服务器证书CN=servicebus.windows.net,并在SSL协议的服务器hello消息中返回证书链信息。

如果未安装证书链中的某些中间证书,则实例需要向CA服务器发起其他请求以下载中间证书并进行安装。

发生以下任何一种情况时,实例无法为服务总线服务器证书建立可信证书链,然后报告上述证书错误。

  • 实例和CA服务器之间有network problem,因此无法下载证书。

  • 实例无法成功安装证书,例如permissions issues.

<强>解决方案: 如你所说:

  • 我们可以将调用ConnectionMode更改为HTTPS

    ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.Https

  • 在VM上手动installing the certificate

答案 1 :(得分:0)

不幸的是,我没有提到该软件包是由Powershell脚本执行的。结果是SSIS包继承了执行Powershell脚本的帐户的权限,这不足以安装证书;以管理员身份运行Powershell脚本解决了问题,所需的证书(中间证书颁发机构&gt; Microsoft IT LTS CA 5(由Baltimore Cyber​​Trust Root发布))正确安装。在我弄清楚之前,我还尝试了 Tom Sun 的解决方案建议来手动安装证书,这确实也有用。