Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问Azure服务总线队列的SSIS脚本任务引发X.509证书错误_Ssis_Client Certificates_Azure Servicebus Queues - Fatal编程技术网

访问Azure服务总线队列的SSIS脚本任务引发X.509证书错误

访问Azure服务总线队列的SSIS脚本任务引发X.509证书错误,ssis,client-certificates,azure-servicebus-queues,Ssis,Client Certificates,Azure Servicebus Queues,我有一个SSIS包,其中包含一个脚本任务,用于将消息放置在Azure服务总线上。SSIS包正在MS SQL Server 2014上运行,运行在带有Windows Server 2012的Azure VM上。这在我的开发机器和我控制的测试Azure VM上运行良好。我的客户已将其安装到其生产Azure VM中,我无法访问该虚拟机,现在它始终生成错误: X.509证书CN=servicebus.windows.net不在trusted people>存储中…在Microsoft.ServiceBu

我有一个SSIS包,其中包含一个脚本任务,用于将消息放置在Azure服务总线上。SSIS包正在MS SQL Server 2014上运行,运行在带有Windows Server 2012的Azure VM上。这在我的开发机器和我控制的测试Azure VM上运行良好。我的客户已将其安装到其生产Azure VM中,我无法访问该虚拟机,现在它始终生成错误:

X.509证书CN=servicebus.windows.net不在trusted people>存储中…在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上手动安装证书,但我想更全面地理解这个问题,并在可能的情况下解决这个问题,而不必求助于这些解决方法

我在其他StackOverflow帖子中看到过建议的解决方法,包括1将调用ConnectionMode更改为HTTP或HTTPS,或2在VM上手动安装证书,但我想更全面地理解这个问题,并在可能的情况下解决这个问题,而不必求助于这些解决方法

原因:

如果我们不预先设置ConnectionMode,service bus客户端将以自动检测模式连接。但是自动检测模式最好使用Tcp连接模式

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

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

当出现以下任一情况时,实例无法为service bus服务器证书建立可信证书链,然后报告上述证书错误

实例和CA服务器之间存在网络问题,无法下载证书

实例无法成功安装证书,例如权限问题

解决方案: 正如你提到的:

我们可以将调用连接模式更改为HTTPS

ServiceBusEnvironment.SystemConnectivity.Mode=ConnectivityMode.Https

在虚拟机上手动


不幸的是,我没有提到该包是由Powershell脚本执行的。SSIS包继承了执行Powershell脚本的帐户的权限,这些权限不足以安装证书;以管理员身份运行Powershell脚本解决了此问题,并且Baltimore CyberTrust Root颁发的证书需要中级证书颁发机构>Microsoft IT LTS CA 5已正确安装。在我发现这一点之前,我也尝试了Tom Sun的解决方案建议,手动安装证书,事实上,这也起到了作用