web-dev-qa-db-ja.com

openldap TLSエラー-8179:ピアの証明書発行者が認識されません

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))が再度発生しました。

これらの証明書ファイルを誤って作成していますか?

1
Matthew Moisen

これらのエラーを受け取った理由は、サーバーに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)
2
Matthew Moisen

Openldap 2.4はtlsにデフォルトのポート398を使用するので、それを介してs_clientを試してください。 /etc/openldap/slapd.d/にある設定ファイルを確認し、データベースインスタンスファイルcn = olcDatabase = {2} hdb.ldifを確認できます。このファイルには、証明書のファイル名と場所を含めることができます。あなたの会社がgoDaddyのようなドメインプロバイダーから証明書を購入する場合、openldapでインストールするためにその証明書を購入して使用することができ、インターネットでサーフィンするとき、それは世界的な証明書であるため、ブラウザーからの赤い警告に遭遇しません。または、opensslを使用して独自の証明書を作成し、サーバーの証明書部分をopenldapサーバーにインストールし、クライアントの部分をクライアントにインストールして、お互いを識別できるようにすることができます。

0
Tuyen Pham