2017-08-02 1 views
4

Je souhaite interroger ActiveDirectory à l'aide de LDAP sur TLSv1.2 et de .NET Framework 4.5.2 ou 4.6.2 (mais j'ai des problèmes avec les deux). Le problème est qu'il continue à essayer d'utiliser TLSv1.0, même si j'utilise "ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12".Connexion à LDAP à l'aide de C# et TLSv1.2

Le "System.DirectoryServices.Protocols" est-il un package que je peux utiliser pour interroger LDAP sur TLSv1.2? Si oui, quelle est la bonne façon d'activer cette version de TLS?

En fin de compte, je veux le faire à partir d'un contrôleur API Web 2, mais comme un test simple qui reproduit la question, je l'application console suivante:

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

Pour le serveur, je suis test cela en utilisant un conteneur docker OpenLdap (avec les ports 30389 et 30636 exposés, plutôt que les ports standard), bien que finalement ce code sera utilisé pour connecter & requête ActiveDirectory.

Pour se démarquer du serveur LDAP de test, j'arrive d'utiliser (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 

Wireshark Circule également: le trafic vu dans Wireshark montre que la "version" dans le « Client Bonjour "paquet est" TLS 1.0 (0x0301) ".

Les journaux dans le salon du serveur LDAP ouvert:

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) 
+0

Je suppose que vous avez déjà regardé celui-ci http://blogs.perficient.com/microsoft/2016/04/ tsl-1-2-and-net-support/mais juste au cas où vous ne l'avez pas –

+0

Oui, j'ai regardé celui-là et d'autres comme ça. J'ai essayé la version où TLS1.2 devrait fonctionner (.NET 4.6.2) et ai également essayé le 4.5 "ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12". Aucune approche ne semble fonctionner pour LDAP. –

Répondre

0

Ajouter une clé de registre couple pour permettre TLS 1.2; le script PowerShell suivant les ajoute:

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 

J'ai trouvé ces informations ici: https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/operations/manage-ssl-protocols-in-ad-fs