title: System.Net.WebRequest and TLS 1.2 creates a 'Handshake Failure' with haproxy
body: <p>I'm unable to use <code>System.Net.WebRequest</code> for a request with TLS 1.2.
  If I do so, I get an Exception <code>The request was aborted: Could not create SSL/TLS secure channel.</code> and the protocol error <code>Handshake Failure</code>.</p>
  
  <p>Connection over TLS 1.2 and authentication is working with Internet Explorer and Chrome.
  OpenSSL can connect to this enpoint over TLS 1.2.</p>
  
  <h1>Setup</h1>
  
  <ol>
  <li>Using ClientCertificates for authentication</li>
  <li>Using non default Port</li>
  <li>Using TLS 1.2</li>
  <li>Endpoint is a haproxy but this is a blackbox</li>
  <li>.NET 4.7 and C#</li>
  </ol>
  
  <h1>Code snipplet</h1>
  
  <pre><code>ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
  var req = WebRequest.Create($"https://{host}:{port}");
  ((HttpWebRequest)req).ClientCertificates = new X509Certificate2Collection(GetCertificate());
  var requestStream = req.GetRequestStream();
  </code></pre>
  
  <p>The method <code>GetCertificate()</code> returns a certificat with private key which is embedded in this software.</p>
  
  <h1>Wireshark</h1>
  
  <p><em>A text output from wireshark in the order the occure.</em></p>
  
  <p><strong>Client Hello</strong></p>
  
  <pre><code>Secure Sockets Layer
      TLSv1.2 Record Layer: Handshake Protocol: Client Hello
          Content Type: Handshake (22)
          Version: TLS 1.2 (0x0303)
          Length: 207
          Handshake Protocol: Client Hello
              Handshake Type: Client Hello (1)
              Length: 203
              Version: TLS 1.2 (0x0303)
              Random: 5a292ab72d2173fc286aebe2c4cc991ee619e1cc81b5bb39...
              Session ID Length: 0
              Cipher Suites Length: 60
              Cipher Suites (30 suites)
              Compression Methods Length: 1
              Compression Methods (1 method)
              Extensions Length: 102
              Extension: server_name (len=43)
                  Type: server_name (0)
                  Length: 43
                  Server Name Indication extension
                      Server Name list length: 41
                      Server Name Type: host_name (0)
                      Server Name length: 38
                      Server Name: [REMOVED]
              Extension: supported_groups (len=8)
                  Type: supported_groups (10)
                  Length: 8
                  Supported Groups List Length: 6
                  Supported Groups (3 groups)
              Extension: ec_point_formats (len=2)
                  Type: ec_point_formats (11)
                  Length: 2
                  EC point formats Length: 1
                  Elliptic curves point formats (1)
              Extension: signature_algorithms (len=20)
                  Type: signature_algorithms (13)
                  Length: 20
                  Signature Hash Algorithms Length: 18
                  Signature Hash Algorithms (9 algorithms)
              Extension: SessionTicket TLS (len=0)
                  Type: SessionTicket TLS (35)
                  Length: 0
                  Data (0 bytes)
              Extension: extended_master_secret (len=0)
                  Type: extended_master_secret (23)
                  Length: 0
              Extension: renegotiation_info (len=1)
                  Type: renegotiation_info (65281)
                  Length: 1
                  Renegotiation Info extension
                      Renegotiation info extension length: 0
  </code></pre>
  
  <p><code>Server Name: [REMOVED]</code> contains the right server name.</p>
  
  <p><strong>Server Hello</strong></p>
  
  <pre><code>Secure Sockets Layer
      TLSv1.2 Record Layer: Handshake Protocol: Server Hello
          Content Type: Handshake (22)
          Version: TLS 1.2 (0x0303)
          Length: 65
          Handshake Protocol: Server Hello
              Handshake Type: Server Hello (2)
              Length: 61
              Version: TLS 1.2 (0x0303)
              Random: 5a292ab7238205b2b8a2e6692abfd518a054515e53cd5b16...
              Session ID Length: 0
              Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
              Compression Method: null (0)
              Extensions Length: 21
              Extension: server_name (len=0)
                  Type: server_name (0)
                  Length: 0
              Extension: renegotiation_info (len=1)
                  Type: renegotiation_info (65281)
                  Length: 1
                  Renegotiation Info extension
                      Renegotiation info extension length: 0
              Extension: ec_point_formats (len=4)
                  Type: ec_point_formats (11)
                  Length: 4
                  EC point formats Length: 3
                  Elliptic curves point formats (3)
              Extension: SessionTicket TLS (len=0)
                  Type: SessionTicket TLS (35)
                  Length: 0
                  Data (0 bytes)
  </code></pre>
  
  <p><strong>Certificate</strong></p>
  
  <pre><code>Secure Sockets Layer
      TLSv1.2 Record Layer: Handshake Protocol: Certificate
          Content Type: Handshake (22)
          Version: TLS 1.2 (0x0303)
          Length: 3855
          Handshake Protocol: Certificate
              Handshake Type: Certificate (11)
              Length: 3851
              Certificates Length: 3848
              Certificates (3848 bytes)
  </code></pre>
  
  <p><strong>Server Hello Done</strong></p>
  
  <pre><code>Secure Sockets Layer
      TLSv1.2 Record Layer: Handshake Protocol: Server Key Exchange
          Content Type: Handshake (22)
          Version: TLS 1.2 (0x0303)
          Length: 589
          Handshake Protocol: Server Key Exchange
              Handshake Type: Server Key Exchange (12)
              Length: 585
              EC Diffie-Hellman Server Params
                  Curve Type: named_curve (0x03)
                  Named Curve: secp256r1 (0x0017)
                  Pubkey Length: 65
                  Pubkey: ...
                  Signature Hash Algorithm: 0x0401
                  Signature Length: 512
                  Signature: ...
  </code></pre>
  
  <p><strong>Multiple Handshake Messages</strong></p>
  
  <pre><code>Secure Sockets Layer
      TLSv1.2 Record Layer: Handshake Protocol: Multiple Handshake Messages
          Content Type: Handshake (22)
          Version: TLS 1.2 (0x0303)
          Length: 77
          Handshake Protocol: Certificate
              Handshake Type: Certificate (11)
              Length: 3
              Certificates Length: 0
          Handshake Protocol: Client Key Exchange
              Handshake Type: Client Key Exchange (16)
              Length: 66
              EC Diffie-Hellman Client Params
                  Pubkey Length: 65
                  Pubkey: ...
      TLSv1.2 Record Layer: Change Cipher Spec Protocol: Change Cipher Spec
          Content Type: Change Cipher Spec (20)
          Version: TLS 1.2 (0x0303)
          Length: 1
          Change Cipher Spec Message
      TLSv1.2 Record Layer: Handshake Protocol: Encrypted Handshake Message
          Content Type: Handshake (22)
          Version: TLS 1.2 (0x0303)
          Length: 40
          Handshake Protocol: Encrypted Handshake Message
  </code></pre>
  
  <p><strong>Handshake Failure</strong></p>
  
  <pre><code>Secure Sockets Layer
      TLSv1.2 Record Layer: Alert (Level: Fatal, Description: Handshake Failure)
          Content Type: Alert (21)
          Version: TLS 1.2 (0x0303)
          Length: 2
          Alert Message
              Level: Fatal (2)
              Description: Handshake Failure (40)
  </code></pre>
  
  <h1>Update</h1>
  
  <p>Thx to @user3484348 I have now more information.</p>
  
  <p>TLS 1.2 (<strong>not</strong> working):</p>
  
  <pre><code>System.Net Information: 0 : [11752] InitializeSecurityContext(
  credential = System.Net.SafeFreeCredential_SECURITY, 
  context = 1054ea8:6091710, 
  targetName = api.company.com, 
  inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
  
  System.Net Information: 0 : [11752] InitializeSecurityContext(
  In-Buffers count=2, 
  Out-Buffer length=0, 
  returned code=IllegalMessage)
  </code></pre>
  
  <p>TLS 1.0 (working):</p>
  
  <pre><code>System.Net Information: 0 : [11752] InitializeSecurityContext(
  credential = System.Net.SafeFreeCredential_SECURITY, 
  context = 12a5eb0:641d900, 
  targetName = api.company.com, 
  inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
  
  System.Net Information: 0 : [11752] InitializeSecurityContext(
  In-Buffers count=2, 
  Out-Buffer length=0, 
  returned code=ContinueNeeded)
  </code></pre>
  
  <p>The <code>returned code</code> in TLS 1.2 is <code>IllegalMessage</code> and in TLS 1.0 it's <code>ContinueNeeded</code>.</p>