2016-10-06 77 views
0

我尝试连接,并使用下面的代码Azure的服务总线 - 队列连接错误

var connectionString = "<Your connection string>"; 

var queueName = "<Your queue name>"; 

var client = QueueClient.CreateFromConnectionString(connectionString, queueName); 
var message = new BrokeredMessage("This is a test message!"); 
client.Send(message); 

这是他们必须在其网站上作为一个例子相同的代码将消息发送到蔚蓝服务总线队列。

但是,当连接时,它会给出一个SSPI ERROR,其内部例外是'客户端和服务器不具有通用算法'。

另外,我在我的系统中禁用了TLS 1.0和SSL 3.0。是因为这个原因吗?

有人能帮我理解这里有什么问题吗?

+0

哪里是你的应用程序中运行(什么主机)?你有防火墙吗?默认的连接模式是TCP,所以也许端口会被阻塞。更多关于连接模式在这里:https://msdn.microsoft.com/en-us/library/microsoft.servicebus.connectivitymode.aspx?f=255&MSPPError=-2147217396还有另一个线程有类似的问题:http:// stackoverflow .com/questions/35469739/azure-service-bus-connection-error-from-worker-role –

+0

@Sean Feldman我的应用程序运行在azure的web应用程序上,但是这个问题是我在本地IIS服务器上尝试它时发生的。在我的机器上..我没有尝试部署它之后。我也尝试改变服务总线环境,但没有运气。 – Tom

回答

0

客户端和服务器不具备一个共同的算法

这不是一个TCP层的问题。这在TLS握手中更高,它意味着这一点。双方(客户端和服务器)无法就通用密码套件达成一致,握手失败。

通过SSLLab的浏览器测试运行您的客户端的主机(即使它不是一个浏览器): https://www.ssllabs.com/ssltest/viewMyClient.html

然后运行通过服务器测试页的服务总线端点:
https://www.ssllabs.com/ssltest/

比较结果并启用您的客户端中至少有一个密码套件与Service Bus端点上的TLS堆栈接受的内容相匹配。

你也应该简单地尝试这样做:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

..since您禁用了TLS 1.0,我不再肯定你的.NET now defaults to,所以明确设定的协议版本是要走的自然方式。

TLS 1.2发布了back in 2008。您可以确定Azure支持全球所有服务 - check your own Service Bus namespace here! (对于935x/TCP,同样的故事)。

这不足以支持TLS 1.2,您的主机必须至少有一个共同的密码套件与服务器 - 用它来检查你的主机:

https://github.com/snobu/get-schannel-ciphers文件(.exe下/发行/)

+0

我已经在我的应用程序开始中明确地设置了安全协议版本。我可以确认并确保我的应用程序对出站请求使用TLS 1.1或TLS 1.2。我猜Azure服务总线在TLS 1.0上运行,并且无法处理TLS 1.1及更高版本 – Tom

+0

2008年发布了TLS 1.2(https://tools.ietf.org/html/rfc5246)。您可以确定Azure支持全球所有服务 - 请参阅https://www.ssllabs.com/ssltest/analyze.html?d=takethebus.servicebus.windows.net(针对9354/TCP的相同故事)。仅支持TLS 1.2是不够的,您的主机必须至少拥有一个通用的密码套件 - 使用它来检查您的主机:https://github.com/snobu/get-schannel-ciphers(.exe/Release /) – evilSnobu

+0

我知道我正在拖动一个较旧的帖子,但它是我能找到的唯一一个与我正在处理的内容非常接近的东西。我遇到了同样的问题,我试图在PCI要求意味着TLS 1.0被禁用的计算机上使用Azure Service Bus。有趣的是,当启用TLS 1.0时,一切正常。简单地禁用TLS 1.0会中断应用程序。我不会假装理解密码套件的所有内容,但它肯定看起来像TLS 1.0是一切正常的问题。 – meyousikmann

0

我们遇到的,当我们禁用TLS 1.0和1.1(我们使用https://docs.nwebsec.com/projects/AzureStartupTasks/en/latest/也下的Application_Start在Global.asax中添加

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

)完全相同的问题。

我们在微软的支持下打开了一张票,发现Azure服务总线需要升级到.Net Framework 4.6.2才能支持TLS 1.1和TLS 1.2。以下是详细信息:

服务总线依靠底层SSLStream类进行NetEventRealyBinding的安全通信。

在.Net Framework 4.5.2中包含的WCF中,SSLStream仅支持SSL 3.0和TLS 1.0。

.Net Framework 4.6.2中的WCF版本支持SSLStream的TLS 1.1和TLS 1.2。

Service Bus Service需要更新才能使用.Net Framework 4.6.2。目前服务总线使用具有.Net Framework 4.5.2的OSFamily 4 https://docs.microsoft.com/en-us/azure/cloud-services/cloud-services-guestos-update-matrix#family-4-releases。目前计划升级到.Net框架计划在2017年中。

我会更新此答案,我听到更多来自微软。

更新2017年3月21日:

微软发送此解决方案,其中固定的问题,并让我们的代码使用TLS 1.2工作。

  1. 在当前用于设置TLS 1.2的PowerShell脚本中,添加以下行。在.Net Framework 4.5.2上,这将迫使SslStreams使用Tls 1.0/1.1/1.2。但是因为你的机器只允许使用TLS 1.2。

    UpdateRegistryKey "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" "SchUseStrongCrypto" 1 "DWORD"   
    
  2. 在你的代码的启动添加以下行,并重建和重新测试

    ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.Https;