tl; drこのエラーは、会社のLDAPサーバーのパブリック証明書を見つけてインストールする必要があるか、または会社のLDAPサーバーがパブリック証明書をインストールする必要があることを意味しますか?前者の場合、どうすれば証明書を取得してインストールできますか?
アプリケーションを会社のLDAPと統合しようとしています。 LDAPとSSLは初めてなので、お詫びします。非SSLでこれを正常に実行できますが、SSLを介してこれを実行しようとすると、この問題が発生します。私はopenldap
バージョン2.4のRhel6.4を使用しています。
ldapsearch
のいずれかを使用する
_ldapsearch -v -h myhost.com -b 'DC=myhost,DC=com, -D 'CN=me,DC=myhost,DC=com' -x -W -Z
_
またはPython
_import ldap
con = ldap.initialize('ldaps://myhost.com')
dn = 'CN=me,DC=myhost,DC=com'
pw = 'password'
con.simple_bind_s(dn, pw)
_
結果は:
_ldap_start_tls: Connect error (-11)
additional info: TLS error -8179:Peer's Certificate issuer is not recognized.
_
これは、会社のLDAPサーバーの公開証明書を見つけて、たとえば/ etc/openldap/certsなどのどこかにインストールする必要があることを意味しますか?または、公開証明書を承認するように会社のLDAPサーバーに指示する必要があるということですか?
_openssl s_client -connect myhost.com:636
_
これは証明書をダンプしますが、最後に言う:
_Verify return code: 20 (unable to get local issuer certificate)
_
繰り返しますが、これがLDAPサーバーの証明書が必要かどうか、またはその逆かどうかはわかりません。
私はこのような証明書チェーンを見ようとしました:
_openssl s_client -showcerts -connect myhost.com:636
_
証明書を順番にコピーして、cert.pemという名前のファイルを作成しました。
_-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
_
私はこれを試しました:
_openssl s_client -connect myhost.com:636 -cert /path/to/cert.pem
_
しかし、それは失敗しました:
_unable to load client certificate private key file
140503604590408:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:
Expecting: ANY PRIVATE KEY
_
(これについても-CAfileと-CApathを試しましたが、_unable to get local issuer certificate
_を受け取りました。)
Pemファイルを再作成しましたが、今回はサーバーの秘密鍵と証明書、続いてLDAPサーバーの証明書が含まれていましたが、同じエラー(Verify return code: 20 (unable to get local issuer certificate)
)が再度発生しました。
これらの証明書ファイルを誤って作成していますか?
これらのエラーを受け取った理由は、サーバーにLDAPサーバーの証明書がインストールされていなかったためです。 LDAPサーバーにサーバーの証明書をインストールする必要はありません。
私は、ルート証明書と中間証明書の2つの証明書を両方ともder
形式で提供できる社内の誰かに連絡しました。特に、これらの証明書は、openssl s_client -showcerts
コマンドを使用して受け取ったものと同じではありませんでした。私は this link に従ってder
からpem
に変換しました。
openssl x509 -in root.cer -inform der -outform pem -out root.pem
openssl x509 -in intermediary.cer -inform der -outform pem -out intermediary.pem
# Combine these files into one cert in exactly this order
cat root.pem > master.pem
cat intermediary.pem >> master.pem
その後、このコマンドを正常に発行できます
openssl s_client -connect myhost:636 -CAfile /path/to/master.pem
そしてPythonで接続するには:
import ldap
# point to the cert
cert_file='/path/to/master.pem'
ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, cert_file)
con = ldap.initialize('ldaps://myhost.com')
dn = 'CN=me,DC=myhost,DC=com'
pw = 'password'
con.simple_bind_s(dn, pw)
Openldap 2.4はtlsにデフォルトのポート398を使用するので、それを介してs_clientを試してください。 /etc/openldap/slapd.d/にある設定ファイルを確認し、データベースインスタンスファイルcn = olcDatabase = {2} hdb.ldifを確認できます。このファイルには、証明書のファイル名と場所を含めることができます。あなたの会社がgoDaddyのようなドメインプロバイダーから証明書を購入する場合、openldapでインストールするためにその証明書を購入して使用することができ、インターネットでサーフィンするとき、それは世界的な証明書であるため、ブラウザーからの赤い警告に遭遇しません。または、opensslを使用して独自の証明書を作成し、サーバーの証明書部分をopenldapサーバーにインストールし、クライアントの部分をクライアントにインストールして、お互いを識別できるようにすることができます。