Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpClient如何处理加密的详细信息是什么?_C#_.net_Encryption_Dotnet Httpclient_Tls1.2 - Fatal编程技术网

C# HttpClient如何处理加密的详细信息是什么?

C# HttpClient如何处理加密的详细信息是什么?,c#,.net,encryption,dotnet-httpclient,tls1.2,C#,.net,Encryption,Dotnet Httpclient,Tls1.2,相关的: 下面的示例说明了我如何进行Web服务调用: class Program { static void Main(string[] args) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; var client = new HttpClient(); client.DefaultRequestHeaders.Accept.Clear(

相关的:

下面的示例说明了我如何进行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
    }
}
正如我从那里的答案以及从中了解到的,这将建立一个安全的TLS连接,并且消息将被加密

我从以及前面提到的文档和Q&A中了解到,它使用公钥加密来验证服务器的身份,并使用AES进行交换。然而,维基百科对具体细节(如AES密钥大小和模式、密钥交换和存储方式等)的解释并不明确。在
HttpClient
中如何处理此问题?它使用的AES密钥大小和模式是什么(如果它实际上使用AES),它如何进行密钥交换,以及它如何存储密钥?

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

Microsoft提供了有关如何查找详细信息的说明。他们建议在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位,他们使用椭圆曲线Diffie-Hellman作为密钥协议,以及其他各种安全细节。

使用哪种加密算法和协议取决于服务器。不能保证建立TLS连接,也可能是SSL连接ction(TLS的前身)。如果您的问题是使用哪种精确算法,那么答案是:这取决于。使用的对称和非对称算法及其密钥长度都是可协商的,很好的解释:&此协商对TLS 1.2的要求(即最小值)在这里,我相信任何特定事务中涉及的客户端和服务器都可以在规范允许的范围内指定它们支持和想要使用的确切方法。几乎所有这些问题的答案都是,它是在服务器和客户端之间协商的,基于操作系统中配置的首选项,并受rotocol.
HttpClient
本身做的很少;它遵从本机安全软件包
schannel
。@LukasBoersma优点-事实上,我偶尔会收到一个错误,说它无法建立TLS/SSL连接(不过错误通常通过重试来解决),所以它看起来像是真正建立了一个安全的连接。我应该试着向API供应商询问服务器正在做什么的详细信息,还是有办法不必与他们核实就可以了解我这方面发生了什么?