2017-12-07 142 views
6

Nie mogę użyć System.Net.WebRequest dla żądania z TLS 1.2. Jeśli to zrobię, otrzymuję wyjątek The request was aborted: Could not create SSL/TLS secure channel. i błąd protokołu Handshake Failure.System.Net.WebRequest i TLS 1.2 tworzą "Usterkę Handshake" z haproxy

Połączenie przez TLS 1.2 i uwierzytelnianie działa z Internet Explorer i Chrome. OpenSSL może łączyć się z tym punktem przez TLS 1.2.

Konfiguracja

  1. Korzystanie ClientCertificates dla uwierzytelniania
  2. Korzystanie non domyślny port
  3. Korzystanie TLS 1.2
  4. Endpoint jest haproxy ale to Blackbox
  5. .NET 4.7 i C#

Fragment kodu

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 
var req = WebRequest.Create($"https://{host}:{port}"); 
((HttpWebRequest)req).ClientCertificates = new X509Certificate2Collection(GetCertificate()); 
var requestStream = req.GetRequestStream(); 

Metoda zwraca kod z kluczem prywatnym osadzonym w tym oprogramowaniu.

Wireshark

Wyjście tekst z Wireshark w kolejności wystąpić maksymalnie.

Client Witam

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 

Server Name: [REMOVED] zawiera odpowiednią nazwę serwera.

Server Witam

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) 

Certyfikat

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) 

Server Witam Sporządzono

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: ... 

wielu wiadomości Handshake

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 

Handshake Awaria

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) 

Aktualizacja

Thx do @ user3484348 Mam teraz więcej informacji.

TLS 1,2 (nie roboczego)

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) 

TLS 1.0 (roboczy):

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) 

returned code w TLS 1.2 IllegalMessage i TLS 1.0 to ContinueNeeded.

+0

Wybrany szyfr pakiet 'TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256' serwera ... Czy można sprawdzić, czy jest to w liście, że klient obsługuje? –

+0

Jeśli możesz, wejdź na serwer i zajrzyj do dzienników zabezpieczeń, aby sprawdzić, czy możesz uzyskać więcej informacji. –

+0

Może to pomoże. Brzmi jak to samo wydanie https://stackoverflow.com/questions/6232746/c-sharp-httpwebrequest-sec-i-renegotiate-intermittent-errors –

Odpowiedz

1

Prawdopodobnie twój GetCertificate() zwraca certyfikat nie z repozytorium certyfikatów Windows. Po włączeniu aplikacji w System.Net informacje debugowania przez dodanie

<system.diagnostics> 
<sources> 
    <source name="System.Net"> 
    <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"/> 

do pliku .config, widać „AcquireCredentialsHandle() nie powiodło się z powodu błędu 0X8009030D”. lub coś podobnego. Wygląda na to, że System.Net nie może używać certyfikatu z kluczem prywatnym, jeśli klucz nie znajduje się w folderze systemu MachineKeys.

Idź tradycyjną drogą - dodać certyfikat do repozytorium, prawa dostępu do pliku kluczy, itp

+0

Dodałem certyfikat do magazynu kluczy maszyny i ustawię prawo użytkownika , ale bez żadnych zmian. Ale w moim przypadku 'AcquireCredentialsHandle' nie zgłasza błędu w moich dziennikach. Zaktualizowałem pytanie. –

+0

Może twój certyfikat ma klucz prywatny np. "C: \ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys", a aplikacja nie ma dostępu do pliku z tym kluczem prywatnym (Uruchom jako administrator lub udzielić dostępu do tożsamości puli aplikacji)? – user3484348