2016-07-15 27 views
6

私はAzureアプリケーションでアプリケーションを実行しました。フレームワークは4.6.1azure: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


あなたはこの1つはAzureの上で作業を取得する方法任意のアイデアを持っていますか?

+0

関連します。http:// stackoverflowの。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の場合、暗号スイートはグローバルにのみ有効または無効にすることができます(クライアント/サーバーコンポーネントの区別なし)ので、これが良いテストになる理由です。

UPDATE:は、Appサービスは、フロントエンド層を持ち、TLSを終端することがありますので、道はどこにも行かない暗号を比較すると、私の推論で明白な問題を発見しました。

代わりに、クーズーのPowerShellのから

Get-TlsCipherSuite 

を実行して、リモートAPIの(あなたがhttps://ssllabs.com/ssltestでオーバーチェックすることができたの暗号)に対して暗号を比較します。少なくとも1つのマッチが必要です。

一致するものがない場合は、クラウドサービスまたはVMに切り替えて、リモートで話す暗号スイートの少なくとも1つを有効にする必要があります。あなたのリモコンは弱い暗号(SSL 3.0またはRC4のTLS 1.0)を使用しているので、これらの市民とチャットをしたり、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 + =(送信者、証明書、チェーン、sslPolicyErrors)=> trueを削除しました。 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;を追加しました。しかし、エラーはまだ同じです –

+0

Hmm .. '--tlsv1.x'で最近の' curl'を使い、リモートが本当にTLS 1.2をサポートしているかどうかを確認してください:https://curl.haxx.se/docs/manpage。 html#-tlsv10。 TLSハンドシェイクClientHello + ServerHello(WiresharkまたはSystem.Netトレース)をキャプチャして、ここにポストして、根本的な原因を見つけるのに役立ててください。 – evilSnobu

+0

メインポストにwiresharkレスポンスを添付しました。それが役立つのでしょうか? –

関連する問題