Curl:ローカル発行者証明書を取得できません。デバッグ方法


14

奇妙な問題があります。LAMP開発マシン(Debian)をPHP 7に更新しました。その後、Curlを介して特定のTLS暗号化APIに接続できなくなりました。

問題のSSL証明書はthawteによって署名されています。

curl https://example.com

私にくれます

curl: (60) SSL certificate problem: unable to get local issuer certificate

一方、

curl https://thawte.com

もちろん、これもThawte Worksによって署名されています。

他のマシン上のHTTPSを介してAPIサイトにアクセスできます。たとえば、curlを介したデスクトップやブラウザーなどです。したがって、証明書は間違いなく有効です。SSL Labsの評価はAです。

私の開発マシンから他のSSL暗号化サイトへの他のCurl要求はすべて機能します。私のルート証明書は最新です。確認するために、実行しましたupdate-ca-certificateshttp://curl.haxx.se/ca/cacert.pemを/ etc / ssl / certsにダウンロードして実行しましたc_rehash

それでも同じエラー。

検証プロセスをデバッグして、どのローカル発行者証明書curl(またはopenssl)が探しているが見つからないか、つまりファイル名を確認する方法はありますか?

更新

curl -vs https://example.com

教えてくれます(IP +ドメイン匿名化)

* Hostname was NOT found in DNS cache
*   Trying 192.0.2.1...
* Connected to example.com (192.0.2.1) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0

そして

echo | openssl s_client -connect example.com:443

与える

CONNECTED(00000003)
depth=2 C = US, O = "thawte, Inc.", OU = Certification Services Division, OU = "(c) 2006 thawte, Inc. - For authorized use only", CN = thawte Primary Root CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=DE/ST=XYZ/CN=*.example.com
   i:/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
 1 s:/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
   i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
 2 s:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
   i:/C=ZA/ST=Western Cape/L=Cape Town/O=Thawte Consulting cc/OU=Certification Services Division/CN=Thawte Premium Server CA/emailAddress=premium-server@thawte.com
---
Server certificate
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
subject=/C=DE/ST=XYZ/CN=*.example.com
issuer=/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
---
No client certificate CA names sent
---
SSL handshake has read 4214 bytes and written 421 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: [...]
    Session-ID-ctx:
    Master-Key: [...]
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 5a 95 df 40 2c c9 6b d5-4a 50 75 c5 a3 80 0a 2d   Z..@,.k.JPu....-
    [...]
    00b0 - d5 b9 e8 25 00 c5 c7 da-ce 73 fb f2 c5 46 c4 24   ...%.....s...F.$

    Start Time: 1455111516
    Timeout   : 300 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
---
DONE

1
少なくともこれらのcmdの詳細な出力を提供できますか?curl -vs https://example.com echo | openssl s_client -connect example.com:443
フランソワ

回答:


8

openssl s_client -connect thawte.com:443ショーの使用:

---
Certificate chain
 0 s:/1.3.6.1.4.1.311.60.2.1.3=US/1.3.6.1.4.1.311.60.2.1.2=Delaware/O=Thawte, Inc./C=US/ST=California/L=Mountain View/businessCategory=Private Organization/serialNumber=3898261/OU=Infrastructure Operations/CN=www.thawte.com
   i:/C=US/O=thawte, Inc./CN=thawte Extended Validation SHA256 SSL CA
 1 s:/C=US/O=thawte, Inc./CN=thawte Extended Validation SHA256 SSL CA
   i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2008 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA - G3
---

最後の「i」は、発行する自己署名ルートCAを示しています。その特定のThawteルートCA、_i.e。プライマリルートCA - G3の証明書は、あなたではありません/etc/ssl/certs(で述べたように、ディレクトリcurl出力; openssl s_clientデフォルトのCAのパスを持っていない、と明示的に指定されたもの、へのニーズなど -CApath /etc/ssl/certs)。

その証明書を/etc/ssl/certsディレクトリに明示的に追加(および再実行c_rehash)しても、確かに問題はありません。そして、例えばを使用して検証されたように機能する場合、このルートCAを取得しなかった理由について、openssl s_client -connect example.com:443 -CApath /etc/ssl/certsそのupdate-ca-certificatesコマンドに検査/デバッグが必要になることがあります。

ここで、上記のルートCAが既に/etc/ssl/certsディレクトリにあり、上記の手順は効果がなかった可能性があります。その場合、チェックする他の2つの発行CA証明書(少なくともが提供する証明書チェーン内thawte.com:443)があります:thawte Primary Root CAおよびthawte SSL CA-G2。上記の手順を繰り返してこれらの証明書を/etc/ssl/certsディレクトリにインストール(および再実行c_rehash)すると機能する場合があります。これら2つはルートCAではなく中間CAであるため、いずれかが存在しないことで結果が説明され、見落とした証明書として期待される可能性がありますupdate-ca-certificates

お役に立てれば!


ありがとう!中間証明書「thawte SSL CA-G2」を/ etc / ssl / certsにダウンロードし、c_rehashを再実行すると問題が修正されました!
ロブ

1
このopenssl s_client -connect <server>:443 -CAfile cacert.pemコマンドは非常に役立ちます...ありがとうございます!
クリス

0

これは、サイトの公開キー証明書ファイル内のサイト、発行、中間証明書、およびルート証明書の間違った順序が原因である可能性があります。

ブラウザは、証明書を上下逆方向(ルート、中間、発行、サイト)で表示しますが、証明書は下-上部方向(サイト、発行、中間、ルート)である必要あります。

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