2016-03-03 44 views
6

Zrobiłem program, który ma akceptować połączenie SSL. Chcę, aby akceptował tylko TLS 1.2 w celu zwiększenia bezpieczeństwa.Nie można uzyskać SslStream w C#, aby zaakceptować protokół TLS 1.2 z .NET framework 4.6

Aby to zrobić, zainstalowałem platformę .net 4.6 i skompilowałem SW za pomocą Visual Studio 2015 express na komputerze z Windows 7 Professional SP1. Docelowa struktura pod „Aplikacja” w VS zostały ustawione na 4,6

W SW używam metody SslStream do weryfikacji certyfikatu, oraz w celu zapewnienia, że ​​tylko TLS 1.2 jest używany, wprowadzić linię

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 

próbowałem wstawienie tej linii zarówno w main() i tuż przed nową strumień SSL

do testu używam OpenSSL do podłączenia, z poleceniem:

openssl s_client -connect 10.0.0.101:1400 -tls1_2 -cert MyCert.pem -key private.pem -CAfile entrust.cer

Moim problemem jest to, że program C# dostaje następujący wyjątek:

Exception: A call to SSPI failed, see inner exception.

Inner exception: The function requested is not supported

Wyjście z OpenSSL jest

CONNECTED(00000150) 7964:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:.\ssl\s3_pkt.c:362:

no peer certificate available

No client certificate CA names sent

SSLL handshake has read 5 bytes and written 7 bytes

New, (NONE), Cipher is (NONE) Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : 0000 Session-ID: Session-ID-ctx: Master-Key: Key-Arg : None PSK identity: None PSK identity hint: None SRP username: None Start Time: 1457011106 Timeout : 7200 (sec) Verify return code: 0 (ok)

Jeśli używam -tls1 nie ma żadnych problemów, więc zakładam, że to dlatego, że. SslStream netto nie obsługuje tls1_2 (lub tls1_1)

Czy ktoś może wyjaśnić, że to, co robię źle

/Karsten

+0

Po pewnym czasie okazało się, że TLS 1.1 i 1.2 nie jest enabeled w Win 7 domyślnie. MS podaje w [Ustawienie TLS/SSL] (https://technet.microsoft.com/en-us/library/dn786418.aspx) przewodnik, w jaki sposób włączyć go, wprowadzając zmiany za pośrednictwem regedit. Mój problem polega na tym, że patrząc na HKEY_LOCAL_MASCHINE \ SYSTEM \ CurrentControlSet \ Control \ SecurityProviders \ SCHANNEL \ Protocols, mam tylko wpis SSL 2.0, ale jak stwierdzono, działa on na SSL3/TLS1.0. Czy muszę dokonać zmian w reg. Baza danych ? –

+0

Nie jestem zaznajomiony z openssl ani używanie SslStream w trybie słuchania, więc nie mogę bezpośrednio odpowiedzieć na twoje pytanie. Wiem jednak, że mój Windows 7 włącza protokoły TLS 1.0, 1.1 i 1.2. Wpisy rejestru dotyczące SCHANNEL mogą być używane do wyłączenia określonych protokołów, ale ich stan domyślny jest włączony. Nie powinieneś zmieniać rejestru, aby to działało. –

+1

Cześć ... cóż ... to jedna z rzeczy, których nie rozumiem ... Mogę połączyć się z TLS 1.2 z przeglądarką itp., Ale jeśli spróbuję połączyć się z aplikacją konsolową z TLS 1.2, jestem odrzucony z powyższy opis, mimo że korzystam z frameworku 4.6 we właściwościach i ustawię flagę TLS 1.2 w flagach protokołu zabezpieczeń .... –

Odpowiedz

7

Konfiguracja ServicePointManager naprawi połączenia internetowe (na przykład z WebClient), ale dla SslStream potrzebujesz nieco więcej. Musisz podać akceptowane protokoły bezpieczeństwa w swoim wywołaniu do AuthenticateAsClient. Więc zamiast

sslStream.AuthenticateAsClient(hostname); 

zrobić

sslStream.AuthenticateAsClient(hostname, null, SslProtocols.Tls12, true); 
+0

Dzięki! Utknąłem na mniej niż w pełni użytecznym "wyjątku funkcji, który nie jest obsługiwany" z serwerem TLS 1.2-only, i to naprawiło! –

+0

Jak jednak to działa z klientem C#? – Tsury

Powiązane problemy