c# .net active-directory ldap tls1.2

Conéctese a LDAP usando c#y TLSv1.2



.net active-directory (1)

Quiero consultar ActiveDirectory usando LDAP sobre TLSv1.2 y .NET Framework 4.5.2 o 4.6.2 (pero tengo problemas con ambos). El problema es que sigue intentando usar TLSv1.0, aunque estoy usando "ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12".

¿Es el "System.DirectoryServices.Protocols" un paquete que puedo usar para consultar LDAP sobre TLSv1.2? Si es así, ¿cuál es la forma correcta de habilitar esa versión de TLS?

En última instancia, quiero hacer esto desde un controlador Web API 2, pero como una simple prueba que reproduce el problema, tengo la siguiente aplicación de consola:

using System; using System.Diagnostics; using System.DirectoryServices.Protocols; using System.Net; namespace Ldap { class Program { private const string ldapHost = "169.254.212.120"; private const int ldapPort = 30389; // normally just 389 private const int ldapSslPort = 30636; // normally just 636 private const bool sslEnabled = true; private const string userBaseDistinguishedName = "dc=example,dc=org"; private const string bindUserCommonName = "admin"; private const string bindUserDistinguishedName = "cn=admin,dc=example,dc=org"; private const string bindUserPassword = "admin"; static void Main(string[] args) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; using (LdapConnection connection = CreateConnection()) { try { connection.Bind(); } catch (Exception e) { Debug.WriteLine(e.Message); } } } private static LdapConnection CreateConnection() { var directoryIdentifier = new LdapDirectoryIdentifier(ldapHost, sslEnabled ? ldapSslPort : ldapPort, true, false); var credential = new NetworkCredential(bindUserDistinguishedName, bindUserPassword); var conn = new LdapConnection(directoryIdentifier, credential, AuthType.Basic); conn.SessionOptions.SecureSocketLayer = sslEnabled; conn.SessionOptions.ProtocolVersion = 3; // Use LDAPv3 (otherwise it appears to default to LDAPv2) return conn; } } }

Para el servidor, estoy probando esto usando un contenedor acoplador OpenLdap (con los puertos 30389 y 30636 expuestos, en lugar de los puertos estándar), aunque finalmente este código se usará para conectar y consultar ActiveDirectory.

Para poner de pie el servidor LDAP de prueba, estoy usando (Docker 17.06 CE):

docker run --name test_ldap -p 0.0.0.0:30636:636 -p 0.0.0.0:30389:389 --env LDAP_TLS_CIPHER_SUITE="SECURE256:+SECURE128:-VERS-TLS-ALL:+VERS-TLS1.2:-RSA:-DHE-DSS:-CAMELLIA-128-CBC:-CAMELLIA-256-CBC" --env LDAP_TLS_VERIFY_CLIENT="allow" --hostname example.org --detach osixia/openldap:1.1.7

También ejecutando Wireshark: el tráfico visto en Wireshark muestra que la "Versión" dentro del paquete "Cliente Hola" es "TLS 1.0 (0x0301)".

Los registros dentro del servidor LDAP abierto muestran:

59810624 conn=1002 fd=16 ACCEPT from IP=172.17.0.1:44606 (IP=0.0.0.0:636) TLS: can''t accept: An unknown public key algorithm was encountered.. 59810624 conn=1002 fd=16 closed (TLS negotiation failure)


Agregue un par de claves de registro para habilitar TLS 1.2; el siguiente script de PowerShell los agrega:

New-Item ''HKLM:/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/TLS 1.2/Client'' -Force | Out-Null New-ItemProperty -path ''HKLM:/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/TLS 1.2/Client'' -name ''Enabled'' -value ''1'' -PropertyType ''DWord'' -Force | Out-Null New-ItemProperty -path ''HKLM:/SYSTEM/CurrentControlSet/Control/SecurityProviders/SCHANNEL/Protocols/TLS 1.2/Client'' -name ''DisabledByDefault'' -value 0 -PropertyType ''DWord'' -Force | Out-Null

Encontré esta información aquí: https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/manage-ssl-protocols-in-ad-fs