2016-10-06 74 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;