SSL証明書エラー:エラーを確認してください:num = 20:ローカル発行者証明書を取得できません


11

LDAPSサーバー(Active Directory)へのSSL接続を機能させようと試みましたが、問題が解決しません。私はこれを使ってみました:

openssl s_client -connect the.server.edu:3269 

結果は次のとおりです。

verify error:num=20:unable to get local issuer certificate 

サーバーは数年前の古い運用サーバーだと思いました。CAが存在しない可能性があります。次に、証明書を出力からpemファイルにプルして試してみました。

openssl s_client -CAfile mycert.pem -connect the.server.edu:3269

そして、それもうまくいきませんでした。

何が欠けていますか?それは常にうまくいくべきではありませんか?

ssl  openssl 

明確にするために、LDAPSは、Windowsから提供された場合、接続が確立されたときにCA証明書を提示しないように見えます。したがって、以下の回答で説明されているように、CA X.509証明書を取得し、base64としてエクスポートして割り当てる必要があります。私の場合、python-ldapを使用して、それをGLOBALスコープ(ldap.initialize()インスタンスではない)に次のように割り当てます:ldap.set_option(ldap.OPT_X_TLS_CACERTFILE,'./ca_issuer_cert.pem') この後、期待どおりに(LDAPポート389内で)STARTTLSを使用できました。
mbrownnyc 2013年

回答:


4

だから、これは私がCA証明書名として見るものです:

depth=1 /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at //www.verisign.com/rpa (c)10/CN=VeriSign Class 3 International Server CA - G3
verify error:num=20:unable to get local issuer certificate
verify return:0

これは、上記の2回目の試行で-showcertsを実行した後にインポートした証明書の名前です。これを実行して、証明書をキーストアにリストしました。

$JAVA_HOME/bin/keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts

そこにCA証明書が表示されます。

Alias name: versign2006
Creation date: Jan 21, 2011
Entry type: trustedCertEntry

Owner: CN=VeriSign Class 3 International Server CA - G3, OU=Terms of use at www.verisign.com/rpa (c)10, OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5, OU="(c) 2006 VeriSign, Inc. - For authorized use only", OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
Serial number: 641be820ce020813f32d4d2d95d67e67
Valid from: Sun Feb 07 19:00:00 EST 2010 until: Fri Feb 07 18:59:59 EST 2020
Certificate fingerprints:
  MD5:  BA:B0:65:B4:3B:9C:E8:40:30:21:7D:C5:C6:CD:3F:EB
  SHA1: B1:8D:9D:19:56:69:BA:0F:78:29:51:75:66:C2:5F:42:2A:27:71:04

opensslがサーバーで使用しているキーストアを使用していることを確認するには、-CAfile引数を使用しています。

openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts

CAのJavaキーストアにパスワードがあることがわかっているので、次のように-pass pass:passwordオプションを使用してみました。

openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts -pass pass:changeit

しかし、それもうまくいきませんでした。

これについておかしいのは、cacertsファイルにパスワードが設定されており、opensslがcacertsファイルを読み取れないことについて文句を言わないことです。それは私には怪しいようです。それか何かでベルが鳴りますか?


3

そのエラーは、「信頼されたルートへの証明書チェーンをたどることができない」というopensslの言い方です。私は自分のADサーバーに対して同じコマンドを実行しただけで、完全な証明書チェーンを取得しましたが、一番上の証明書にはその正確なエラーがあります。証明書に署名したCAのpub-keyがある場合は、-CAfileまたは-CApathオプションで指定できます


わかりました、応答をありがとう。だから私はそれを試しました。同じことを-showcertsオプションをオンにしてCA証明書を取得し、他の証明書を取得しました。それはCA証明書であるべきですよね?PEMファイルのサーバー証明書の代わりにそれを試して、同じエラーメッセージが表示されました。他に何か考えはありますか?

その場合、期限切れなどの別の理由で検証に失敗している可能性があります。
sysadmin1138

1

LDAPSサーバー(Active Directory)へのSSL接続を機能させようと試みましたが、問題が解決しません。私はこれを使ってみました:

OpenLDAPを使用している場合は、以下を設定できます。

TLS_REQCERT=never

openldap.confOpenLDAPに証明書の検証を試行しないように指示します。ApacheでLDAP認証を行う場合も、同様のオプションがあります。

本当に証明書の検証を実行したい場合は、次の方法が役立ちます。

何が欠けていますか?それは常にうまくいくべきではありませんか?

私はそうは思いません。以下は決定的に聞こえるかもしれませんが、それは本当に私の最高のゲストです:

あなたが試みたものは自己署名証明書に対してのみ機能します。証明書は実際にはWindows CAによって発行されたため、サーバー証明書を引数として使用して-CAfileも何も起こりません。

同じことを-showcertsオプションをオンにしてCA証明書を取得し、他の証明書を取得しました。それはCA証明書であるべきですよね?

必ずしもそうではありません。リモートサーバーが出力にCA証明書を提示する保証はありません。まず、サーバー証明書の発行者を確認する必要があります。

openssl x509 -in server.crt -noout -text | grep Issuer

...次に、所有している他の証明書のいずれかがその発行者と一致するかどうかを確認します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.