2016-07-15 4 views
6

Azure 응용 프로그램에서 응용 프로그램을 실행합니다. 표준 : 1 작은 계획. 프레임 워크는 4.6.1입니다.azure에서만 : SSL/TLS 보안 채널을 만들 수 없습니다.

이 응용 프로그램은 SSL 보안 API를 호출합니다. SSL이 StartCom Class 1 DV Server CA에 의해 게시되면 내 로컬 브라우저에서 인증서가 유효 함을 알려줍니다.

내 로컬 컴퓨터에서 응용 프로그램을 실행하면 모든 것이 작동합니다. 푸른에 배포 할 때, 그것은 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


입니까?

+0

관련 : HTTP : // 유래.com/questions/34437473/can not-create-ssl-tls-secure-channel-in-the-azure-web-application? rq = 1 –

+0

이제 textuploader.com 링크가 끊어졌습니다. –

답변

3

TLS 핸드 셰이크를 캡처하십시오. ServerHello가 누락 된 경우 원격지에 공통 암호 모음이 없을 가능성이 큽니다.

https://www.ssllabs.com/ssltest/을 통해 실행하여 양쪽에서 지원되는 암호 스위트를 확인하십시오. Windows Server의 경우 cipher suite는 전역 적으로 만 사용하거나 사용하지 않도록 설정할 수 있습니다 (클라이언트/서버 구성 요소 사이의 구별없이). 이것이 좋은 테스트를 만드는 이유입니다.

UPDATE : 내 추론의 눈부신 문제를 발견 앱 서비스는 프론트 엔드 층을 가지고 있으며, TLS 그래서 방법은 아무데도 가지 않는다 암호를 비교, 종료 곳이 있습니다.

대신, 쿠두의 PowerShell을에서

Get-TlsCipherSuite 

를 실행하고 원격 API의에 대한 암호 (당신이 https://ssllabs.com/ssltest에 걸쳐 확인할 수있는의 암호)를 비교합니다. 적어도 하나의 일치가 있어야합니다.

일치하는 항목이 없으면 클라우드 서비스 또는 VM으로 전환하고 원격에서 말하는 암호 그룹 중 적어도 하나를 사용하도록 설정해야합니다. 이 방향으로 나아가려면 리모컨이 약한 암호화 (SSL 3.0 또는 RC4가있는 TLS 1.0)를 사용하고 있으며 해당 시민과 채팅하거나 TLS 1.2를 흔들어 놓고있는 새로운 시민을 찾아야합니다. 당신의 System.Net 추적에서

:

공통 암호 이론을 기반으로 Fatal Handshake Error에 대한 바이트 순서의
[8356] 00000000 : 15 03 03 00 02 

.

주 첫 번째 바이트 (0x15) :

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

감사합니다. ServicePointManager .ServerCertificateValidationCallback + = (보낸 사람, 인증서, 체인, sslPolicyErrors) => true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;를 추가했습니다. 그러나 오류는 여전히 동일합니다 –

+0

음 ..'--tlsv1.x'와 함께 최근의 curl을 사용하고 원격지가 실제로 TLS 1.2를 지원하는지 확인하십시오 : https://curl.haxx.se/docs/manpage. html # -tlsv10. TLS 핸드 셰이크 ClientHello + ServerHello (Wireshark 또는 System.Net 추적)를 캡처하여 여기에 게시하면 근본 원인을 찾는 데 도움이됩니다. – evilSnobu

+0

wireshark 응답을 메인 포스트에 첨부했습니다. 그게 도움이 되나요? –

관련 문제