Webサイトへの要求に使用する必要がありますが、curl
WebサイトはTLSの中間証明書を提供しません。
私が言いたいことは:
TLSを使用してサーバーに接続するときは、次のことを行う必要があります(rfc5246 F.1.1, rfc5246 7.4.2) は、サーバーの証明書を検証するのに十分なすべての証明書をクライアントに提供します。これは、次に接続するときを意味します。www.google.com、ホスト証明書(* .google.com)と中間証明書(GTS CA 1C3)とルート証明書(GTS Root R1)を提供しました。問題サイトにアクセスすると、ホスト証明書のみが提供されます。
例: openssl s_client -connect google.com:443 -showcerts 2>&1 < /dev/null
- 3 つの証明書が提供されます。
これはほとんどのブラウザでは大丈夫ですが、CURLではそうではありません。
curl --insecure
したがって、サイト用のバンドルを使用するか手動で更新する必要があります。
接続を安全にしたいのですが自動です。
URLで完全な証明書チェーンを構築し、ルートCAバンドルに対して検証し、検証にcurl --insecure --pinnedpubkey <value>
失敗した場合に使用する値を出力するツールがありますか?
答え1
この場合、カール処理はビルドによって異なります。
カールは何でも使用できます複数のTLSの実装はコンパイル時に決定され、カールのTLS実装動作がカールのTLS実装に依存することは驚くべきことではありません。
カールにschannelを使用すると、失われたチェーン証明書を取得できます。(RFCの要求に応じてサーバーから送信されない)AIAを使用して結果を確認します。また、欠落しているチェーン証明書がWindows証明書ストアにある場合、schannelを使用したカールは欠落しているチェーン証明書を埋めます(例:いつも確認する根Windows証明書ストアにあります)、これらのチェーン証明書をいつ取得したかを簡単に確認することはできませんが、プーチン私(Win 10 Home)システムであるWindows Storeは、多くのWeb検索に毎日使用され、時にはカールやPowershell iwrなどの作業(実際には約12件)に使用されます。もちろん、カールとschannelはWindowsでのみ利用可能です。 schannelがサポートしていない機能を使用することを提案したので、--pinnedpubkey
schannelを使用しないことがあります。
OpenSSLはこのために確かにAIAを使用しないため、多くの(すべてではない)Linuxディストリビューションで広く使用されているOpenSSLカールもAIAを使用しません。 Fredericが発見したように、OpenSSLは〜する提供されたファイルにチェーン証明書(ルートを含む)を入力します。--cacert
したがって、どのチェーン証明書が必要かを知っているか推測できる場合は、事前にダウンロードしてください。
NSS自体がAIAを実行できると確信していますが(Firefoxが行うことができるように)、カールがAIAにアクセスまたは有効にできるかどうかを知らず、NSSを使用して簡単にテストできます(WSLのUbuntu 16.04ではもちろんです)。ちょっと古い) そうしないでください..
GnuTLSについてはわかりませんが、CentOS 7でGnuTLSを使用するカールはこれを行いません。
ただし、実際の問題の場合、これを手動で実行して結果を保存するためのツールはありません。
https://www.ssllabs.com/ssltest/ブラウザと同じ方法で証明書/チェーンの作成と確認、結果の表示など、SSL / TLSの機能と互換性の非常に広範なテスト多くの種類パスが見つかると、そのパスは信頼できますが、ブラウザはこれを実行しません。これらの結果を傷つけることもできます。https://whatsmychaincert.com/チェーンビルド/修正を行ったときに良いPEMが生成されたことを覚えているようですが、私が知っている唯一のパブリックテストが現在破損しているため確認できません(Fredericが引用したものと同じ不完全なチェーン)。 badssl.com)。
Java(より正確には「標準」暗号化プロバイダを使用する場合、JavaでSSL / TLS実装であるJSSE)は、認証の一部としてインポートするためにAIAを使用できます(デフォルトでは有効にする必要はありません)。 Webサイトに接続し、AIA.caIssuersが有効になっている証明書を確認し、成功すると生成された証明書および/または固定キーを作成する簡単なJavaプログラムです。より良い解決策がない場合は、20〜30行しかかかりません。提供され、後で時間があれば試してみましょう。 (またはこれはスタックです。他の人もこれを行うことができます。)
答え2
curl
自己署名証明書を処理できます。
信頼できるパスを介してダウンロードした証明書の場所を入力するだけですcurl --cacert fullchain.pem URL
。fullchain.pem
curl
適切なルートを使用しないと、curl
サーバーは信頼できず、--insecure
それを満たすためのオプションが必要です。
ご注意くださいhttps://regery.com/en/security/ssl-tools/self-signed-certificate-generator(またはその他のツール)を使用すると、誰でもすべてのサーバーに対して自己署名証明書を作成できます。curl
自己署名証明書を持つサーバーは、他の方法でこの証明書を提供しない限り信頼できません。
curl
別の証明書を使用すると、一時ルート証明書(Verisign、DigiCert、LetsEncrypt ...を参照/etc/ssl/certs/
)を信頼し、curl
ルート証明書をサーバー証明書に関連付けることができるため、簡単です。サーバー証明書を使用する場合は、別のルートを提案する必要があります。