Tengo una pregunta simple pero no puedo encontrar una respuesta en ningún lado. Tengo una aplicación de servidor WCF. Quiero que use SOLO TLS1.2.
No tengo control sobre el cliente y no puedo editar la configuración de SCHANNEL en la máquina.
Ya probé lo siguiente, que parece funcionar solo para conexiones salientes (lado del cliente)
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12¿Hay alguna forma de restringir algo que no sea TLS 1.2 en el servidor por código?
EDITAR: estoy usando un enlace net.tcp y creo enlaces como ese:
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 } } }; }Si alguien pudiera decirme dónde verificar la versión TLS de la conexión actual (algún contexto), ¡eso también sería suficiente!
¡Gracias de antemano!
De hecho, hay algunas propiedades en ServicePointManager además SecurityProtocol que se verifican durante el paso de autenticación, pero todas son internal . Tampoco parece haber una puerta trasera visible para anular toda la implementación de SslStream o TcpTransportSecurity , que están implementando el esqueleto de Transport Security para NetTcpBinding .
public partial class ServicePointManager { ... internal static bool DisableStrongCrypto internal static bool DisableSystemDefaultTlsVersions internal static SslProtocols DefaultSslProtocols ... }Si tiene permiso de escritura para el registro de la máquina del servidor, consulte lo que @JohnLouros describió muy bien hace un año en sus publicaciones sobre cómo deshabilitar los protocolos débiles y cómo habilitar la criptografía fuerte .
Aquí hay otra buena respuesta de @MattSmith que describe cómo el propio sistema operativo maneja la autenticación para NetTcpBinding detrás de escena.
¿Intentó usar ServicePointManager.ServerCertificateValidationCallback ? Esta devolución de llamada le brinda la oportunidad de validar el Certificado del servidor usted mismo. Por ejemplo, algo como esto:
ServicePointManager.ServerCertificateValidationCallback = MyCertHandler; ... static bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error) { //Your logic here for certificate validation }