他のものについては、独自のテスト CA を生成することができます。
証明書チェーンに信頼できる認証局が含まれていません
テスト CA (または自己署名証明書) を使用してテスト証明書を生成できますが、検証には既定のシステム CA リストを使用します。テスト クライアントはその証明書の検証に失敗するはずです。
有効期限前に使用された場合、有効期限後に使用された場合
現在の日付を無効にする notBefore/notAfter 日付を使用して、テスト CA を使用してテスト証明書を生成できます。次に、テスト CA を検証用の信頼できる CA として使用します。テスト クライアントは、日付が原因で証明書の検証に失敗するはずです。
取り消されました
失効の公開方法にもよりますが、これはおそらく最も設定が難しいものです。ここでも、独自のテスト CA を使用して、すぐに取り消したテスト証明書をいくつか生成します。一部のツールは、一連の信頼できる CA の隣にある一連の CRL ファイルを使用して構成することを想定しています。これには、テスト自体のセットアップが必要ですが、オンライン セットアップはほとんど必要ありません。これがおそらく最も簡単です。CRL 配布ポイントや OCSP などを使用して、ローカルのオンライン失効リポジトリを設定することもできます。
PKI テストは、より一般的にはより複雑になる可能性があります。完全なテスト スイートを作成するには、仕様 (RFC 5280) を十分に理解している必要があります。実際、すべての中間証明書の日付と、チェーン内の各証明書のさまざまな属性 (鍵の使用法、基本的な制約など) を確認する必要がある場合があります。
一般に、クライアント ライブラリでは、検証プロセスが 2 つの操作に分けられます。証明書が信頼されていることの検証 (PKI 部分) と、証明書が接続先のエンティティに対して発行されたことの検証 (ホスト名検証部分) です。これは確かに、これらが異なるドキュメント (それぞれ RFC 3280/5280 および RFC 2818/6125) で指定されているという事実によるものです。
実用的な観点から、SSL ライブラリを使用する際に確認すべき最初の 2 つのポイントは次のとおりです。
- 既知のホストに接続しているが、証明書が有効でない別の識別子 (ホストではなくその IP アドレスなど) を使用するとどうなりますか?
- デフォルトのトラステッド アンカー セット (自己署名証明書や独自の CA など) では検証できないことがわかっている証明書に接続するとどうなりますか。
どちらの場合も、接続/検証の失敗が発生するはずです。すべてが機能する場合、完全な PKI テスト スイート (特定の専門知識が必要) を実装するまでは、SSL ライブラリのドキュメントをチェックして、これらの検証を有効にする方法を確認する必要がある場合がよくあります。
バグは別として、このホワイト ペーパーで言及されている問題のかなりの数は、ライブラリの実装によっては、自分が何をしているかを知るのはユーザー次第であると仮定しているという事実によるものですが、ほとんどのユーザーは仮定をしているようです。ライブラリがデフォルトで正しいことをしていたこと。(実際、ライブラリがデフォルトで正しいことを行っている場合でも、アプリケーションが安全でなくなったとしても、エラー メッセージを取り除きたいだけのプログラマーは少なくありません。)ほとんどの場合、検証機能がオンになっていることを確認するだけで十分です。
いくつかの既存の実装のステータスについては、次のとおりです。
Python: Python 2.x と Python 3.x の間で変更がありました。ssl
Python 3.2のモジュールにはmatch_hostname
、Python 2.7 にはないメソッドがあります。urllib.request.urlopen
Python 3.2 には CA ファイルを設定するオプションもありますが、これは Python 2.7 に相当するものにはありません。(とは言っても、設定しないと検証が行われません。ホスト名の検証についてはよくわかりません。)
Java: の PKI とホスト名の両方に対して検証がデフォルトでオンになっていますが、Java 7 を使用していて(たとえば) Java 7 を使用して構成していない限り、直接HttpsUrlConnection
使用する場合はホスト名に対してはオンになっていません。SSLSocket
SSLParameters
setEndpointIdentificationAlgorithm("HTTPS")
PHP: 私の知る限り、fopen("https://.../")
検証はまったく実行されません。