13

Novell がリリースしたライブラリ (Novell.Directory.Ldap) を使用しようとしています。バージョン 2.1.10。

私がこれまでに行ったこと:

  • アプリケーション(LdapBrowser)との接続をテストしましたが、動作しているため、通信の問題ではありません。

  • Mono でコンパイルされていますが、Visual Studio で作業しています。そのため、ソースを使用してプロジェクトを作成しました。プロジェクトが Mono.Security に依存していたため、Mono.Security への参照も含めました。

  • より多くの例外をスローしていたため、接続の一部をキャッチするエラーで呼び出し (freeWriteSemaphore(semId); ) にコメントしました。その呼び出しが何をしたかを確認しましたが、それは単なるエラー追跡メカニズムです。

  • Novell のドキュメント ( http://www.novell.com/coolsolutions/feature/11204.html )に記載されている基本的な手順に従いました。

    // LdapConnection インスタンスの作成

    LdapConnection ldapConn= 新しい LdapConnection(); ldapConn.SecureSocketLayer = ldapPort == 636;

    //Connect 関数はサーバーへのソケット接続を作成します

    ldapConn.Connect(ldapHost,ldapPort);

    //Bind 関数は、ユーザー オブジェクト資格情報をサーバーにバインドします

    ldapConn.Bind(userDN,userPasswd);

  • 現在、Bind() 関数でクラッシュしています。エラー 91 が表示されます。

では、誰かがこのライブラリを使用して動作するのを見たことがありますか? もしそうなら、それを機能させるために何をしましたか?特別な設定が必要ですか? Mono を使用せずに .NET 環境で動作させる方法はありますか (Mono dll を参照することはできますが、サーバーにインストールしたくありません)。

(更新) 接続はポート 636 で行われるため、SSL を使用します。WireShark で通信を確認し、LDAP Browser から取得したものと比較しました。SSL証明書が通信されるステップがLDAPライブラリによって行われていないことがわかりました。では、本来の目的を果たすための最良の方法は何ですか?

(更新) ドキュメントを確認したところ、SSL をサポートしていないことが示されています。http://www.novell.com/coolsolutions/feature/11204.html

LdapConnection.Bind() を使用して LDAP サーバーに対して認証します。クリアテキスト認証のみをサポートしています。SSL/TLS サポートはまだ追加されていません。

ただし、ドキュメントの日付は 2004 年であり、それ以来、多くの更新が行われています。ライブラリには、接続で SSL を使用するかどうかを定義するパラメーターがあります。だから今、私は混乱しています。

(更新) より最新のドキュメントを見つけました: http://developer.novell.com/documentation//ldapcsharp/index.html?page=/documentation//ldapcsharp/cnet/data/bqwa5p0.html . SSL 接続を確立する方法は、サーバーに証明書を登録することです。問題は、私がやっていることは特定の Novell サーバーにバインドされていないため、証明書を動的に取得する必要があることです。

4

8 に答える 8

7

同様の問題の解決策を探しに来ました。Novell の Web サイトの同じコードを使用している場合、bind コマンドも失敗します。私にとってうまくいった解決策は、動的な証明書検証コールバックを追加することでした。ここでそれについて読むことができます。

        // Creating an LdapConnection instance 
        LdapConnection ldapConn = new LdapConnection();

        ldapConn.SecureSocketLayer = true;

        ldapConn.UserDefinedServerCertValidationDelegate += new
                CertificateValidationCallback(MySSLHandler);


        //Connect function will create a socket connection to the server
        ldapConn.Connect(ldapHost, ldapPort);

        //Bind function will Bind the user object Credentials to the Server
        ldapConn.Bind(userDN, userPasswd);

        // Searches in the Marketing container and return all child entries just below this
        //container i.e. Single level search
        LdapSearchResults lsc = ldapConn.Search("ou=users,o=uga",
                           LdapConnection.SCOPE_SUB,
                           "objectClass=*",
                           null,
                           false);

        while (lsc.hasMore())
        {
            LdapEntry nextEntry = null;
            try
            {
                nextEntry = lsc.next();
            }
            catch (LdapException e)
            {
                Console.WriteLine("Error: " + e.LdapErrorMessage);
                // Exception is thrown, go for next entry
                continue;
            }
            Console.WriteLine("\n" + nextEntry.DN);
            LdapAttributeSet attributeSet = nextEntry.getAttributeSet();
            System.Collections.IEnumerator ienum = attributeSet.GetEnumerator();
            while (ienum.MoveNext())
            {
                LdapAttribute attribute = (LdapAttribute)ienum.Current;
                string attributeName = attribute.Name;
                string attributeVal = attribute.StringValue;
                Console.WriteLine(attributeName + "value:" + attributeVal);
            }
        }
        ldapConn.Disconnect();
        Console.ReadKey();
    }

public static bool MySSLHandler(Syscert.X509Certificate certificate,
            int[] certificateErrors)
        {

            X509Store store = null;
            X509Stores stores = X509StoreManager.CurrentUser;
            //string input;
            store = stores.TrustedRoot;

            X509Certificate x509 = null;
            X509CertificateCollection coll = new X509CertificateCollection();
            byte[] data = certificate.GetRawCertData();
            if (data != null)
                x509 = new X509Certificate(data);

            return true;
        }
于 2012-12-06T14:38:46.100 に答える
4

私はついにこれを機能させる方法を見つけました。

まず、論文の投稿が正しい軌道に乗るのに役立ちました: http://directoryprogramming.net/forums/thread/788.aspx

次に、Novell LDAP Library のコンパイル済み dll を入手し、Mono.Security.Dll を使用しました。

ソリューション:

この関数をコードに追加しました

// This is the Callback handler - after "Binding" this is called
        public bool MySSLHandler(Syscert.X509Certificate certificate, int[] certificateErrors)
        {

            X509Store store = null;
            X509Stores stores = X509StoreManager.LocalMachine;
            store = stores.TrustedRoot;

            //Import the details of the certificate from the server.

            X509Certificate x509 = null;
            X509CertificateCollection coll = new X509CertificateCollection();
            byte[] data = certificate.GetRawCertData();
            if (data != null)
                x509 = new X509Certificate(data);

            //List the details of the Server

            //if (bindCount == 1)
            //{

            Response.Write("<b><u>CERTIFICATE DETAILS:</b></u> <br>");
            Response.Write("  Self Signed = " + x509.IsSelfSigned + "  X.509  version=" + x509.Version + "<br>");
            Response.Write("  Serial Number: " + CryptoConvert.ToHex(x509.SerialNumber) + "<br>");
            Response.Write("  Issuer Name:   " + x509.IssuerName.ToString() + "<br>");
            Response.Write("  Subject Name:  " + x509.SubjectName.ToString() + "<br>");
            Response.Write("  Valid From:    " + x509.ValidFrom.ToString() + "<br>");
            Response.Write("  Valid Until:   " + x509.ValidUntil.ToString() + "<br>");
            Response.Write("  Unique Hash:   " + CryptoConvert.ToHex(x509.Hash).ToString() + "<br>");
            // }

            bHowToProceed = true;
            if (bHowToProceed == true)
            {
                //Add the certificate to the store. This is \Documents and Settings\program data\.mono. . .
                if (x509 != null)
                    coll.Add(x509);
                store.Import(x509);
                if (bindCount == 1)
                    removeFlag = true;
            }

            if (bHowToProceed == false)
            {
                //Remove the certificate added from the store.

                if (removeFlag == true && bindCount > 1)
                {
                    foreach (X509Certificate xt509 in store.Certificates)
                    {
                        if (CryptoConvert.ToHex(xt509.Hash) == CryptoConvert.ToHex(x509.Hash))
                        {
                            store.Remove(x509);
                        }
                    }
                }
                Response.Write("SSL Bind Failed.");
            }
            return bHowToProceed;
        }

そして、私はバインディングプロセスでそれを使用しました

// Create Connection
                LdapConnection conn = new LdapConnection();
                conn.SecureSocketLayer = true;
                Response.Write("Connecting to:" + ldapHost);

                conn.UserDefinedServerCertValidationDelegate += new
                    CertificateValidationCallback(MySSLHandler);

                if (bHowToProceed == false)
                    conn.Disconnect();
                if (bHowToProceed == true)
                {
                    conn.Connect(ldapHost, ldapPort);
                    conn.Bind(loginDN, password);
                    Response.Write(" SSL Bind Successfull ");

                    conn.Disconnect();
                }
                quit = false;

重要な要素は、SSL ハンドラーを使用して証明書を動的に取得することと、X509StoreManager.LocalMachine を使用して、Web サイトの実行中に証明書を保存および取得できるようにすることです。

于 2009-01-13T21:54:48.263 に答える
3

91は「接続できません」です。サーバーを「ldap://xxxx」形式で入力してみてください。userDN が正しく設定されていること (ドメインなど) を確認してください。

私はよくWireSharkを使用して、ネットワーク レベルで何が起こっているかを確認しています (これは LDAP プロトコルを認識しています)。

于 2008-12-22T18:59:21.003 に答える
2

別の質問で他の誰かにこの回答をすでに提供している可能性があると思います。

[LDAPに関するその他の質問][1]

私が考える2つの問題:1)どのような種類のバインドをしようとしていますか?SSL? クリアテキスト?匿名?

2) LDAP バインド用に eDirectory 側でどのように設定されていますか?

ツール LDAP ブラウザ、このリンクのツールを参照していますか? 無料の LDAP ブラウザ

eDirectory 側では、すべての LDAP 通信に TLS を要求でき、匿名バインドを禁止できます。

相手側に LDAP トレースを有効にするよう依頼できますか (+LDAP オプションを有効にして DStrace を使用する方法については、Novell eDirectory で Dstrace を使用する方法に関するいくつかのリンクを参照してください: Different types of Dstrace Capturing and understand DS Trace for Identity Manager.)

それは通常、あなたを啓発するエラーメッセージを表示します。

私の推測では、Require TLS が有効になっており、SSL バインドが成功していない可能性があります。

その場合は、SSL を有効にして、ログインしようとしているユーザーの完全修飾 DN を使用して、ポート 636 で接続を試みます。

SSL を有効にして試しても、ツリー CA の信頼されたルート証明書の受け入れに関するポップアップ ボックスが表示されない場合は、CA または eDirectory サーバーのユーザーの SSL 証明書が期限切れになっているか壊れている可能性があります。(これには、一般的な原因がいくつかあり、修正するのに少し時間がかかります)。

通常、問題がある場合、Dstrace では SSL 証明書に関するエラーが表示されます。期限切れの証明書の Novell Identity Manager の観点からの例は、次の記事にあります。証明書の期限切れと、証明書を修正する方法の詳細。

次の可能性として、指定している DN が正しくない可能性があります。

さらにサポートが必要な場合はお知らせください。

于 2008-12-22T19:04:41.833 に答える
1

以前の投稿に続いて - 安全な接続を使用する必要がある場合は、ldaps:// をサーバー アドレスのプレフィックスとして使用してみてください。

SSL/TLS サポートがない場合は、OpenLDAP ライブラリのガイドラインと .NET ラッパーを試すことができます。

1 つの重要なポイント - OpenLDAP には TLS セキュリティ レベルの設定があるため、LDAP サーバーに自己署名証明書がある場合は、クライアント側でそれをインポートするか、署名機関をチェックしないように TLS を設定する必要があります *もちろん安全性は低くなります)。

于 2008-12-23T16:33:08.473 に答える