Ограничить все, кроме TLS 1.2 serveride WCF

У меня есть простой вопрос, но я не могу найти ответ нигде. У меня есть приложение WCF-Server. Я хочу, чтобы он использовал ТОЛЬКО TLS1.2.

У меня нет контроля над клиентом, и я не могу редактировать настройки SCHANNEL на машине.

Я уже пробовал следующее, которое, похоже, работает только для исходящих соединений (clientside)

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 

Есть ли способ ограничить что-либо, кроме сервера TLS 1.2 на один код?

EDIT: Я использую привязку net.tcp и создаю такие привязки:

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
                }
            }
        };
    }

Если кто-то скажет мне, где проверить TLS-версию текущего соединения (некоторый контекст), который также будет достаточным!

Заранее благодарю вас!

Ответ 1

Есть действительно несколько свойств в ServicePointManager рядом с SecurityProtocol, которые проверяются на этапе аутентификации, но все они internal. Также нет видимого бэкдора для переопределения всей реализации SslStream или TcpTransportSecurity, которые реализуют скелет безопасности безопасности для NetTcpBinding.

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

Если у вас есть разрешение на запись в реестр серверных машин, ознакомьтесь с тем, что @JohnLouros описал очень хорошо год назад в своих сообщениях на как отключить слабые протоколы и как включить сильную криптографию.

Вот еще один хороший ответ от @MattSmith, описывающий, как аутентификация для NetTcpBinding обрабатывается самой операционной системой за кулисами.

Ответ 2

Вы пытались использовать ServicePointManager.ServerCertificateValidationCallback. Этот обратный вызов дает вам возможность самостоятельно проверить сертификат сервера. Например, что-то вроде этого:

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