web-dev-qa-db-ja.com

SSL証明書チェーン検証の理解に関する問題

私のアプリはSSLを使用してサーバーと安全に通信しており、証明書チェーンの検証に問題があります。チェーンは次のようになります。

Entrust.netセキュアサーバー認証局-> DigiCert Global CA-> * .ourdomain.com

Mozillaから取得した証明書ストアを使用しています。 Entrust.net証明書が含まれていますが、DigiCertグローバルCA証明書は含まれていません。

私の理解では、中間機関はルート機関が信頼されている限り信頼する必要はありませんが、検証は失敗します。

% openssl verify -CAfile mozilla-root-certs.crt ourdomain.com.crt
error 20 at 0 depth lookup:unable to get local issuer certificate

検証に合格するには、DigiCert Global CAを明示的に信頼する必要がありますか?それは間違っているようです。しかし、あなたは私に言う!

[〜#〜] edit [〜#〜]:OpenSSLで証明書ファイルを事前に利用できる必要があることを理解しました。このような何かが動作します:

% openssl verify -CAfile mozilla-root-certs.crt -untrusted digicert.crt ourdomain.com.crt
ourdomain.com.crt: OK

これにより、明示的に「信頼している」と言わずにDigiCert CAのコピーを提供できますが、チェーン全体を検証する必要があります。

ただし、Firefoxのようなブラウザには、必要なすべての証明書のコピーが常に付属しているわけではありません。常に新しいCAが存在しますが、ポイントは、ルート証明書のセキュリティを使用して、すべての中間CAが有効であることを確認することです。正しい?それでは、どのようにdoesしますか?見た目ほどばかげていますか?

35
joshk0

中間証明書は、独自のドメインの証明書だけでなく、Webサーバーにもインストールする必要があります。私は先週、この同じ問題を抱えていました... Firefoxは、これについて他のブラウザよりもうるさいようです。

17
David

Webサーバーからの証明書を検証する正しい方法は次のとおりです。

  • クライアントは信頼できるCA ROOT証明書のリストを保持します
  • Webサーバーは次のサーバー証明書を返す必要があります-必須
  • 中間証明書-必須のルートCA証明書-不要/オプション

クライアントがサーバーに接続すると、サーバーからサーバー証明書と中間証明書を取得します。次に、クライアントは、サーバー証明書から、信頼できるCA ROOT証明書の1つまでの中間証明書を介して、信頼チェーンを構築します。ルート証明書は常に自己署名されているため、チェーンが停止します。

Opensslを使用してWebサーバー証明書をテストする簡単なコマンドを次に示します

openssl s_client -CAfile <root ca file> -quiet -showcerts -connect IP:PORT

複数の証明書が同じIP:PORTで提供される仮想ホスティングの場合、サーバー名表示(SNI)は-servername <FQDN>。それ以外の場合、デフォルトの証明書が送信されます。

7
telveer