Comment obtenir un DirectoryEntry à partir de LDAP sur SSL?

Je vais essayer d'obtenir à la racine DirectoryEntry à partir de LDAP afin que je puisse afficher un joli graphique de l'arborescence.

Tout fonctionne à merveille sous les connexions normales, mais je ne peux pas le faire fonctionner avec le protocole SSL.

var root = this.checkBoxSSL.Checked
                    ? new DirectoryEntry("LDAP://" + this.textBoxServer.Text,
                        this.textBoxUsername.Text,
                        this.textBoxPassword.Text,
                        AuthenticationTypes.SecureSocketsLayer)
                    : new DirectoryEntry("LDAP://" + this.textBoxServer.Text,
                        this.textBoxUsername.Text,
                        this.textBoxPassword.Text);
var dn = root.Properties["distinguishedName"].Value;

Et ainsi de suite...

Mais j'obtiens un "Serveur non opérationnelles" l'exception". Tout semble aller vers le bas pour que le processus d'affectation. Basé sur des recherches sur l'internet, il pourrait être un problème avec le certificat et/ou la méthode d'Authentification (l'authentification NTLM, etc).

Alors, comment puis-je obtenir un travail DirectoryEntry sur SSL?

Je suis ouvert à des solutions alternatives, tant que je peux récupérer toutes les LDAP Propriétés des nœuds dont j'ai besoin. (Racine, DC, OU, CN, des Groupes et des Utilisateurs)

EDIT: Comme il semble que le problème vient du certificat SSL. Nous n'avons qu'une auto-signé cert atm. Et cela semble être rejeté par .NET par défaut. Nous allons essayer correctement signé cert plus tard, mais il est probable que j'ai besoin d'être en mesure de gérer autosignés.

C'est là que mes connaissances sur les certificats a des limites. Je suis actuellement en train d'explorer une autre solution de code, car il semble être le seul qui me permet d'influencer la totalité de gestion des certificats:

System.Security.Cryptography.X509Certificates.X509Certificate2 cert = new System.Security.Cryptography.X509Certificates.X509Certificate2();
cert.Import("..\\..\\test certificate.cer");

LdapConnection con = new LdapConnection("ip:636");
con.Credential = new NetworkCredential("un", "pw");
con.AuthType = AuthType.Ntlm;
con.SessionOptions.SecureSocketLayer = true;
con.SessionOptions.VerifyServerCertificate = new VerifyServerCertificateCallback((ldapcon, cer) => {
    var cer2 = new System.Security.Cryptography.X509Certificates.X509Certificate2(cer);

    StringBuilder strb = new StringBuilder();

    strb.AppendFormat("{0} {1} matches: {2}\n", "Subject", cert.Subject, cert.Subject.Equals(cer2.Subject));
    strb.AppendFormat("{0} {1} matches: {2}\n", "Cert Hash", cert.GetCertHashString(), Enumerable.SequenceEqual<byte>(cer.GetCertHash(), cert.GetCertHash()));
    strb.AppendFormat("{0} matches: {2}\n", "Public Key", cert.GetPublicKeyString(), Enumerable.SequenceEqual<byte>(cer.GetPublicKey(), cert.GetPublicKey()));
    strb.AppendFormat("{0}: {1}, {2}", "Verification", cert.Verify(), cer2.Verify());

    var res = MessageBox.Show(strb.ToString(),
        "Allow certificate?", MessageBoxButtons.YesNo);
    return res == System.Windows.Forms.DialogResult.Yes;
});

con.Bind();

Essentiellement, si ce VerifyServerCertificateCallback renvoie true, alors la connexion réussit, si elle renvoie chutes d'échec de la connexion avec la même exception, comme avec toute autre solution que j'ai essayé.

Curieusement, ni l'installation de l'ANNONCE de certificat ou le certificat racine de l'ANNONCE contrôleur n'a pas aider les autres solutions, mais il ne change pas le résultat de la vérification() la méthode.

Ce genre de vérifications dois-je effectuer sur le certificat dans le rappel de maintenir le caractère sacré de la connexion SSL?

J'ai exactement le même problème! Avez-vous réussi à résoudre ce problème?
Oui j'ai plus ou moins fait. Mais depuis que je ne travaille pas plus là je vais avoir à répondre de mémoire. En substance, il s'est avéré que j'ai eu à utiliser deux différentes Bibliothèques LDAP selon si j'ai besoin de SSL ou non. Je ne pouvais pas obtenir LdapConnection de travailler avec SSL et les plus récents .net-library refusé de travailler en non-SSL.
Ok, et la "nouvelle" .net lib, c'est que le LDAPConnection vous avez ici à votre dernier exemple?
La droite. LDAPConnection est le nouveau et DirectoryEntry était l'ancien.

OriginalL'auteur Kempeth | 2015-02-19