web-dev-qa-db-ja.com

SSL証明書エラー:検証エラー:num = 20:ローカル発行者証明書を取得できません

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

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

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

11
Brian

だから、これは私が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

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ファイルを読み取れないことについて文句を言わないことです。それは私には怪しいようです。それか何かでベルが鳴りますか?

4
Brian

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

3
sysadmin1138

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

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

TLS_REQCERT=never

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

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

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

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

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

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

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

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

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

1
larsks