HttpClient如何处理加密的细节是什么?

时间:2018-02-02 15:17:08

标签: c# .net encryption dotnet-httpclient tls1.2

相关:Make Https call using HttpClient

以下是一个说明我如何进行Web服务调用的示例:

class Program
{
    static void Main(string[] args)
    {
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

        var client = new HttpClient();
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(@"text/javascript") { CharSet = "utf-8" });

        client.BaseAddress = new Uri("https://...");

        HttpResponseMessage msg = client.GetAsync("jobs").Result;

        string json = msg.Content.ReadAsStringAsync().Result;

        // Deserialize this for later use
    }
}

正如我从那里的答案以及this那样理解它,这将建立一个安全的TLS连接,并且邮件将被加密。

我对Wikipedia description of TLS 1.2以及之前提到的文档和Q& A的理解是,它使用公钥加密来验证服务器的身份和AES来进行交换。然而,维基百科对于确切的细节(例如AES密钥大小和模式,密钥的交换和存储方式等)含糊不清。如何处理HttpClient?它使用了什么AES密钥大小和模式(如果它 ,实际上是使用AES),它如何进行密钥交换,以及它如何存储密钥?

1 个答案:

答案 0 :(得分:3)

总结评论(作为社区Wiki答案,因为我总结了其他人的资料),内容将被加密,但加密的确切细节是与服务器协商的(意味着没有一个正确的答案 - 这取决于配置)。

Microsoft提供了有关如何查找详细信息here的说明。他们建议在App.config中添加以下内容:

<system.diagnostics>  
    <sources>  
      <source name="System.Net" tracemode="includehex" maxdatasize="1024">  
        <listeners>  
          <add name="System.Net"/>  
        </listeners>  
      </source>  
      <source name="System.Net.Cache">  
        <listeners>  
          <add name="System.Net"/>  
        </listeners>  
      </source>  
      <source name="System.Net.Http">  
        <listeners>  
          <add name="System.Net"/>  
        </listeners>  
      </source>  
      <source name="System.Net.Sockets">  
        <listeners>  
          <add name="System.Net"/>  
        </listeners>  
      </source>  
      <source name="System.Net.WebSockets">  
        <listeners>  
          <add name="System.Net"/>  
        </listeners>  
      </source>  
    </sources>  
    <switches>  
      <add name="System.Net" value="Verbose"/>  
      <add name="System.Net.Cache" value="Verbose"/>  
      <add name="System.Net.Http" value="Verbose"/>  
      <add name="System.Net.Sockets" value="Verbose"/>  
      <add name="System.Net.WebSockets" value="Verbose"/>  
    </switches>  
    <sharedListeners>  
      <add name="System.Net"  
        type="System.Diagnostics.TextWriterTraceListener"  
        initializeData="network.log"  
      />  
    </sharedListeners>  
    <trace autoflush="true"/>  
  </system.diagnostics>

这会产生高度详细的连接日志(包括有关正在使用的加密方案的非常具体的详细信息)。例如,我能够发现AES密钥长度为128位,它们使用Elliptic Curve Diffie-Hellman作为密钥协议,以及安全性的各种其他细节。