2017-03-24 46 views
10

Mam proste pytanie, ale nie mogę znaleźć nigdzie odpowiedzi. Mam aplikację serwera WCF. Chcę, żeby używała TYLKO TLS1.2.Ogranicz wszystko, oprócz serwera TLS 1.2 WCF

Nie mam kontroli nad klientem i nie mogę edytować ustawień SCHANNEL na komputerze.

zrobiłem już spróbować następujących składników, które wydaje się działać tylko dla połączeń wychodzących (stronie klienta)

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 

Czy istnieje jakiś sposób, aby ograniczyć bynajmniej TLS 1.2 serverside za kod?

EDIT: Używam Net.TCP wiążące i tworzą wiązania tak:

private static Binding CreateNetTcpBinding() 
    { 
     return new NetTcpBinding 
     { 
      ReceiveTimeout = TimeSpan.FromMinutes(10), 

      ReliableSession = 
      { 
       Enabled = true, 
       InactivityTimeout = TimeSpan.FromMinutes(1) 
      }, 
      Security = 
      { 
       Mode = SecurityMode.Transport, 
       Transport = 
       { 
        ClientCredentialType = TcpClientCredentialType.Windows, 
        ProtectionLevel = ProtectionLevel.EncryptAndSign, 
        SslProtocols = SslProtocols.Tls12 
       }, 
       Message = 
       { 
        AlgorithmSuite = SecurityAlgorithmSuite.xxx <-- not here on purpose, 
        ClientCredentialType = MessageCredentialType.Windows 
       } 
      } 
     }; 
    } 

Jeśli ktoś może mi powiedzieć, gdzie sprawdzić TLS wersji bieżącego połączenia (kontekst), która też wystarczy!

Z góry dziękuję!

+0

Minęło trochę czasu, odkąd natknąłem się na dobre pytanie w WCF! – iamkrillin

+0

Wygląda na to, że Twój problem został rozwiązany w [.NET Framework 4.7] (https://msdn.microsoft.com/en-us/library/ms171868 (v = vs.110) .aspx # v47) - ** Możliwość konfiguracji domyślne ustawienia bezpieczeństwa komunikatów do TLS 1.1 lub TLS 1.2 ** –

Odpowiedz

0

Czy spróbujesz użyć ServicePointManager.ServerCertificateValidationCallback .To zwrotna daje możliwość Sprawdź poprawność certyfikatu serwera przez yourself.For przykład coś takiego Ci:

ServicePointManager.ServerCertificateValidationCallback = MyCertHandler; 
    ... 
static bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error) 
{ 
    //Your logic here for certificate validation 
} 
+0

Nie trafiają w tę metodę. Prawdopodobnie dlatego, że używam wiązania net.tcp, a nie https? – Dominik

0

skończyłeś próbuje wyłączyć PCT 1.0, SSL 2.0, SSL 3.0 lub TLS 1.0 w IIS? można postępować w ten sposób: How to disable PCT 1.0, SSL 2.0, SSL 3.0, or TLS 1.0 in Internet Information Services

+0

Nie używam IIS, wszystkie self-hosted – Dominik

+0

Drodzy @Dominik Myślę, że działa dla wszystkich rodzajów środowisk Windows. ponieważ powoduje to rejestr, ale nie jestem pewien. – David

+0

Niestety, nawet go nie otworzyłem. Chociaż, jak już wspomniałem w moim pytaniu, nie mogę edytować niczego w rejestrze – Dominik

1

Istnieje wprawdzie kilka właściwości w ServicePointManager obok SecurityProtocol które są sprawdzane podczas etapu uwierzytelniania, ale wszystkie są internal. Wydaje się również, że nie ma widocznego backdoora, który unieważniłby całą implementację SslStream lub TcpTransportSecurity, która implementuje szkielet Transport Security dla NetTcpBinding.

public partial class ServicePointManager { 
    ... 
    internal static bool DisableStrongCrypto 
    internal static bool DisableSystemDefaultTlsVersions 
    internal static SslProtocols DefaultSslProtocols 
    ... 
} 

Jeśli masz uprawnienia do zapisu do rejestru komputera serwera, sprawdź co @JohnLouros opisane bardzo dobrze rok temu w swoich postów na how to disable weak protocols i how to enable strong cryptography.

Oto kolejny dobry answer z @MattSmith opisujący, jak uwierzytelnianie dla NetTcpBinding jest obsługiwane przez system operacyjny za kulisami.

+0

Hmm ... więc wydaje się, że nie jest to możliwe, aby po prostu zrobić coś, co mogę zrobić na kliencie, ustawiając wartość wyliczenia. Szczerze mówiąc, jestem rozczarowany środowiskiem .NET w tym punkcie. Może to też nie rozumiem czegoś dobrze. – Dominik

+0

Dlatego wydaje mi się, że posiadanie kodu, który jest otwarty dla społeczności, ma wiele sensu. Powinieneś być w stanie zgłosić to zespołowi lub nawet go wyciągnąć i samemu popracować nad wymaganymi zmianami. –

Powiązane problemy