信頼されていないSSL証明書

Selenium 2 が信頼されていないSSL証明書を受け入れた方法の詳細

このドキュメントは以前 wiki にありました

はじめに

このページでは、WebDriverが信頼されていないSSL証明書を受け入れる方法について詳しく説明しています。これにより、ユーザーは有効な証明書が通常存在しないテスト環境で、信頼されたサイトをテストできます。この機能は、サポートされているすべてのブラウザ(現在はFirefox)でデフォルトで有効になっています。

Firefox

解決策の概要

Firefoxには、無効な証明書をオーバーライドするためのインターフェースがあり、nsICertOverrideServiceと呼ばれています。信頼されていない証明書が許可されていない限り、このインターフェースを元のサービスへのプロキシとして実装します。許可されている場合、証明書について尋ねられたとき(無効な証明書に対する hasMatchingOverride の呼び出し)は、信頼されていることを示します。

実装の詳細

アイデアの実装はほとんど簡単です - badCertListener.js はスタンドアロンモジュールであり、ロードされると、サービスのインスタンスを返すためのファクトリを登録します。興味深い関数は hasMatchingOverride です。

WdCertOverrideService.prototype.hasMatchingOverride = function(
    aHostName, aPort, aCert, aOverrideBits, aIsTemporary)

aOverrideBits と aIsTemporary は出力引数です。ここから少し厄介になります。3つの可能なオーバーライドビットがあります。

  ERROR_UNTRUSTED: 1,
  ERROR_MISMATCH: 2,
  ERROR_TIME: 4

Firefoxは証明書によって生成された違反と関数の戻り値の完全一致を期待するため、それらをすべて設定することは不可能です: (security/manager/ssl/src/SSLServerCertVerification.cpp:302)

  if (overrideService)
  {
    PRBool haveOverride;
    PRBool isTemporaryOverride; // we don't care
  
    nsrv = overrideService->HasMatchingOverride(hostString, port,
                                                ix509, 
                                                &overrideBits,
                                                &isTemporaryOverride, 
                                                &haveOverride);
    if (NS_SUCCEEDED(nsrv) && haveOverride) 
    {
      // remove the errors that are already overriden
      remaining_display_errors -= overrideBits;
    }
  }

  if (!remaining_display_errors) {
    // all errors are covered by override rules, so let's accept the cert
    return SECSuccess;
  }

違反からエラーコードへの正確なマッピングは、security/manager/pki/resources/content/exceptionDialog.js (Firefoxソース内) で簡単に見ることができます。

  var flags = 0;
  if(gSSLStatus.isUntrusted)
    flags |= overrideService.ERROR_UNTRUSTED;
  if(gSSLStatus.isDomainMismatch)
    flags |= overrideService.ERROR_MISMATCH;
  if(gSSLStatus.isNotValidAtThisTime)
    flags |= overrideService.ERROR_TIME;

SSLステータスは通常 "@mozilla.org/security/recentbadcerts;1" から取得できます - ただし、証明書 (およびそのステータス) は hasMatchingOverride の呼び出し後にのみこのサービスに追加されるため、証明書の SSLStatus を簡単に見つける方法はありません。代わりに、チェックを手動で実行する必要があります。

2つのチェックが実行されます。

  • nsIX509Cert.verifyForUsage を呼び出す。
  • ホスト名を nsIX509Cert.commonName と比較します。それらが等しくない場合、ERROR_MISMATCH が設定されます。

2番目のチェックは、ERROR_MISMATCH を設定する必要があるかどうかを示します。最初のチェックは、ERROR_UNTRUSTED と ERROR_TIME を設定する必要があるかどうかを示す必要があります。残念ながら、証明書が期限切れで、信頼されていない発行者からのものである場合、これは確実には機能しません。証明書の期限が切れている場合、信頼されていなくても、リターンコードは CERT_EXPIRED になります。このため、FirefoxDriver は証明書が信頼されていないと想定しています - 常に ERROR_UNTRUSTED ビットを設定します - 他の2つは、それらの条件が満たされた場合にのみ設定されます。

これは、提供元のホスト名と一致しない有効な証明書を持つサイトをテストしている人(例:本番証明書を提供するテスト環境)にとって問題となる可能性があります。FirefoxProfile の追加機能として、FirefoxProfile.setAssumeUntrustedCertificateIssuer が追加されました。この関数を false で呼び出すと、ERROR_UNTRUSTED ビットがオフになり、ユーザーはそのような状況で作業できるようになります。

HTMLUnit

まだテストされていません。

IE

まだ実装されていません。

Chrome

まだ実装されていません。

最終更新日:2022年1月12日:追加のwiki記事をアーカイブ (e75f49c8af3)