35

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

Entrust.net セキュア サーバー認証局 -> DigiCert グローバル 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 グローバル CA を明示的に信頼する必要がありますか? それは間違っているようです。しかし、あなたは私に教えてください!

編集: 証明書ファイルを事前に OpenSSL で使用できるようにする必要があることを理解しました。このようなものは動作します:

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

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

しかし、Firefox のようなブラウザには、必要なすべての証明書のコピーが常に同梱されているわけではありません。常に新しい CA が存在するため、ポイントは、ルート証明書のセキュリティを使用して、すべての中間 CA が有効であることを確認することです。右?では、これはどのように機能するのでしょうか。見た目と同じくらい本当にばかげていますか?

4

2 に答える 2

17

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

于 2009-09-21T18:40:14.550 に答える
7

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

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

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

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

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

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

于 2012-09-04T17:40:17.570 に答える