web-dev-qa-db-ja.com

特定のサイトへのHTTPS接続がmacOSのcURLで失敗する

私のMacでは、macOS 10.14の組み込みcurlバイナリを使用すると、特定のサイトへのHTTPS接続が失敗します。それらは、同じシステム上のcURLの他のビルドだけでなく、さまざまなブラウザーでも正常に動作します。影響を受けるサイトの1つは、ユーティリティ「Dash」のダウンロードサイト https://kapeli.com/ です。もう1つは https://electroncash.org です。

cURLが期限切れの証明書について不満を言う:

curl: (60) SSL certificate problem: certificate has expired
More details here: https://curl.haxx.se/docs/sslcerts.html

インストール中に Homebrew-Cask を使用してこれに遭遇しました。これは、macOSの組み込みcURLを使用してソフトウェアをダウンロードします。

15
F30

Root 上記のサイト( Comodo および SERTrust )が使用するCA証明書は、今朝(UTC時間)に期限切れになりました。 2つの異なるルートCA証明書がまったく同じ秒で期限切れになるのは驚くべきことですが、 これは SERTrustがComodo(現在のSectigo)と提携している で説明できます。


編集:これら2つは実際にはルートCA証明書ではなく、 "AddTrust External CA Root" で署名された中間CAです。したがって、それらの有効期限は、「AddTrust External CA Root」証明書の有効性によって決定されました。この証明書も、たまたま同じ秒で有効期限が切れています。


現在、更新された証明書(期限が切れた秘密鍵と共有する秘密鍵)が2010年に発行されました( ComodoSERTrust )。これらの証明書は最近の一般的なルートCAストア(Appleのシステムトラストストアを含む)の一部であるため、ブラウザは完全に正常に接続を確立します。カスタムOpenSSLインストールに対してビルドされたcURLのほとんどのバリアント(MacPortsやHomebrewなど)にも同じことが当てはまります。

MacOS 10.14の組み込みcURLバリアントはLibreSSLに対してビルドされ、/etc/ssl/cert.pemをルートCAストアとして使用します。これには、新しい証明書も含まれます。ただし、cURLまたはLibreSSLが有効性チェックのために古い証明書を優先する原因となっているようです。 /usr/bin/openssl s_client/usr/bin/opensslは実際にはLibreSSLから構築されています)を使用して接続を失敗させることができなかったため、cURLは少なくともある程度問題に関係していると思います。

私の仮説は、問題の原因は、期限切れのルートCA証明書を証明書チェーンの一部として送信しているサイトにあると考えられます。このようなチェーンにルートCAを含めることは許可されていますが、必須ではありません。この場合、証明書の検証に違反するようです。


編集:これは、「AddTrust External CA Root」の有効期限に関する一連の問題の一部です。全体像については、Andrew Ayerによる ブログ投稿 またはRyan Sleeviによる Twitterスレッド を参照してください。 Ryan Sleeviには 物事のコレクション があり、期限切れのために失敗します。

MacOS 10.15では、cURLがデフォルトでOpenSSL 0.9.8を使用するため、環境変数CURL_SSL_BACKEND=secure-transportを設定することにより、問題は明らかに 軽減される可能性があります です。これは10.14ではLibreSSLで動作しません。 Christian Heimesによる は、一般的にこの問題の影響を受けます。

16
F30

/etc/ssl/cert.pemAddTrustエントリをコメント化するだけです。最終証明書は相互署名されているため、USERTrustに対して検証されます。

理論的には、そのエントリをコメント化する必要はないはずですが、実際には、macに同梱されているLibreSSLバージョン(Catalinaの2.8.3)は、同じバージョンを含むOpenSSLの古いバージョンに基づいているため、証明書パスの検証に失敗しています。バグ(<1.1.1)。

LibreSSLのドキュメント( https://www.libressl.org/releases.html )によると、彼らはOpenSSL 1.1.1機能を3.xxシリーズに組み込み始めました。更新する方法を見つけることができましたそれは手動ですが、私は怠惰であり、Appleが修正するのを待ちます。

4
Ivan Rodriguez

私が見つけたこれらすべてのサイトは、同じチェーンに期限切れのCA証明書を持っているようです:

openssl s_client -connect kapeli.com:443
CONNECTED(00000003)
depth=3 C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root
verify error:num=10:certificate has expired
notAfter=May 30 10:48:38 2020 GMT

私は今、これについて多くの異なるサイトでポップアップしている問題を見ます。 @jmibanezが提案するようにca certファイルを編集することは、サイトが期限切れの証明書を応答で送信していないときにおそらく機能します。動作しないcurl --cacert path/to/cacert.pemを使用して https://curl.haxx.se/ca/cacert.pem から最新のCA証明書ファイルを試しました。ブラウザは問題ないようですので、Webサイトからの応答に含まれている期限切れのCA証明書を無視しているようです。

編集:私の悪いここ。誤ってcurl 7.54を使用していました。新しいバージョンが動作しています。 curl 7.67/7.70を使用する場合、エラーは存在しません。

2
Johan Andersson

少なくともmacOS 10.15.4の回避策:

今日、codecov bashスクリプトと一緒に同じ問題が発生しました。私の簡単な修正:brew install curlbrew link curlの提案に従ってください。 which curlで正しいカールを選択したかどうかを確認できます(/usr/local/opt/curl/bin/curlをポイントする必要があります)。

私は待つ時間も忍耐力もありません????それらを修正します。

2
menelik

この問題をdebianベースのサーバーで修正する必要がありました

ここにそれが起こった方法があります:

  1. システムからAddTrust_External_Root.crtを削除します(通常は/etc/ssl/certsにあります)
    1. /etc/ca-certificates.confから「mozilla/AddTrust_External_Root」行を削除またはコメント
    2. opensslが使用する証明書を更新するには、Sudo update-ca-certificatesを実行します

それはあなたを助けることができますか?

1
Elvandar