2016-07-15 91 views
6

我在Azure應用程序上運行應用程序Standard:1 Small plan。框架是4.6.1僅在azure上:無法創建SSL/TLS安全通道

此應用程序調用一個SSL安全的API。 SSL由StartCom Class 1 DV Server CA發佈,我的本地瀏覽器告訴我該證書是有效的。

如果我在本地機器上運行應用程序,一切正常。然而,部署到Azure時失敗,follwing錯誤:

System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.

at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)

at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)

--- End of inner exception stack trace ---

at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

代碼:

public async Task<List<QutationOverview>> GetAll(string url, DateTime lastActionDate) 
    { 
     var result = string.Empty; 

     try 
     { 


      var userName = await _settingManager.GetSettingValueAsync("API.UserName"); 
      var password = await _settingManager.GetSettingValueAsync("API.Password"); 


      ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | 
                SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 


      ServicePointManager 
       .ServerCertificateValidationCallback += 
       (sender, cert, chain, sslPolicyErrors) => true; 


      //Add date filter 
      //Always request qutations where the last action took place >= Yesterday 
      var requestUrl = 
       $"GetALL/?last_action_date={lastActionDate.AddDays(-1).ToString("yyyy-MM-dd")}&format=json"; 


      var baseAddress = new Uri(url); 
      var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{userName}:{password}")); 

      Logger.InfoFormat("GetAllQuotationsAsync for url {0}{1}", url, requestUrl); 

      using (var httpClient = new HttpClient {BaseAddress = baseAddress}) 
      { 
       httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentials); 
       using (var response = await httpClient.GetAsync(requestUrl)) 
       { 
        result = await response.Content.ReadAsStringAsync(); 
        Logger.Info(result); 
       } 
      } 
     } 

     catch (Exception ex) 
     { 
      Logger.ErrorFormat("GetAllQuotationsAsync {0}: {1}", url, ex); 
     } 
     var data = JsonConvert.DeserializeObject<List<QutationOverview>>(result); 

     return data; 
    } 

正如你可以看到我跳過證書的驗證和添加的安全協議。

但是,請求仍然失敗。


這裏是caputred響應 http://textuploader.com/5ers0


你有任何想法如何獲得這一個在Azure上工作?

+0

相關:HTTP://計算器。com/questions/34437473/could-not-create-ssl-tls-secure-channel-in-an-azure-web-application?rq = 1 –

+0

textuploader.com鏈接現在已損壞。 –

回答

3

捕獲TLS握手。如果你的ServerHello丟失了,你最有可能沒有使用遠程的通用密碼套件。

通過https://www.ssllabs.com/ssltest/運行兩個檢查兩端支持的密碼套件。對於Windows Server,密碼套件只能在全局範圍內啓用或禁用(因爲客戶端/服務器組件之間沒有區別),所以這就是爲什麼這是一個很好的測試。

UPDATE:發現在我的推理突出的問題,應用服務有一個前端層而這也正是TLS終止,所以比較這種方式去無處密碼。

取而代之的是,從捻的PowerShell中運行

Get-TlsCipherSuite 

和比較反對您的遠程API的密碼(其中你可以在https://ssllabs.com/ssltest檢查過的密碼)。你至少應該有一場比賽。

如果沒有匹配,您需要切換到雲服務或虛擬機,並啓用至少一個遠程講話的密碼套件。必須走這個方向通常意味着一件事 - 您的遠程使用弱密碼學(SSL 3.0或TLS 1.0與RC4),您應該與這些公民聊天,或者找到正在搖晃TLS 1.2的新公民。

從您的System.Net跟蹤:

[8356] 00000000 : 15 03 03 00 02 

這對Fatal Handshake Error字節序列,它建立在我的沒有共同的密碼理論。

注意的第一個字節(0x15):

Record Type Values  dec  hex 
------------------------------------- 
CHANGE_CIPHER_SPEC  20  0x14 
ALERT      21  0x15 
HANDSHAKE     22  0x16 
APPLICATION_DATA   23  0x17 
+0

謝謝,我刪除了ServicePointManager .ServerCertificateValidationCallback + =(sender,cert,chain,sslPolicyErrors)=> true;並添加了ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 ;.然而,錯誤仍然相同 –

+0

嗯..使用最近'curl'和'--tlsv1.x'並檢查遠程是否真的支持TLS 1.2:https://curl.haxx.se/docs/manpage。 HTML# - tlsv10。嘗試捕獲TLS握手ClientHello + ServerHello(Wireshark或System.Net跟蹤),將其發佈到此處,這有助於找到根本原因。 – evilSnobu

+0

我在主帖中附加了wireshark響應。這有幫助嗎? –

相關問題