我正在尝试使用以下代码连接并向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一个内部异常&#39;客户端和服务器不具备通用算法&#39;。
另外,我在系统中禁用了TLS 1.0和SSL 3.0。是因为这个。
有人可以帮我理解这里有什么问题吗?
答案 0 :(得分:0)
客户端和服务器不具备通用算法
这不是TCP层问题。这在TLS握手中更高,这意味着就是这样。双方(客户端和服务器)无法就通用密码套件达成一致,并且握手失败。
通过SSLLab的浏览器测试运行客户端的主机(即使它不是浏览器): https://www.ssllabs.com/ssltest/viewMyClient.html
然后通过服务器测试页面运行Service Bus端点:
https://www.ssllabs.com/ssltest/
比较结果并在客户端中启用至少一个密码套件,该密码套件与Service Bus端点上的TLS堆栈相匹配。
您还应该尝试:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
..因为你已经禁用了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(/ Release /下的.exe)
答案 1 :(得分:0)
我们在禁用TLS 1.0和1.1时遇到了完全相同的问题(我们使用https://docs.nwebsec.com/projects/AzureStartupTasks/en/latest/并添加了
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
在Application_Start下的Global.asax中的。
我们使用Microsoft支持打开了一张票,发现Azure Service Bus需要升级到.Net Framework 4.6.2才能支持TLS 1.1和TLS 1.2。以下是详细信息:
Service Bus依赖底层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。
需要更新服务总线服务以使用.Net Framework 4.6.2。目前,Service Bus使用具有.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 Framework的计划将于2017年中期完成。
一旦我从微软那里听到更多回复,我就会更新这个答案。
更新2017-03-21:
Microsoft发送了此解决方法,修复了该问题并允许我们的代码与TLS 1.2一起使用。
在当前用于设置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"
在您启动代码时添加以下行,然后重建并重新测试
ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.Https;