信頼されていない証明書を使用した SSL の構成

既知のパブリック認証局 (CA) によって署名されていない証明書を使用して、IBM MobileFirst™ Platform Server のインスタンスとクライアント間で SSL が機能するようにすることは簡単ではありません。各モバイル・プラットフォームには独自の特性があり、トランスポート層セキュリティー (TLS) 標準のどの部分をどの時点で実施するかはプラットフォームごとに異なります。

以下の推奨事項は、主として iOS 環境および Android 環境に焦点を合わせています。X.509 証明書のサポートは個々のプラットフォームによるものであり、IBM MobileFirst Platform Foundation によるものではありません。X.509 証明書の具体的な要件について詳しくは、各モバイル・プラットフォームの資料を参照してください。

SSL に関連した問題のためにアプリケーションから MobileFirst Server へのアクセスに障害がある場合、不良サーバー証明書が原因である可能性があります。別の原因として、クライアントがサーバーを信頼するように正しく構成されていないことも考えられます。 SSL ハンドシェークが失敗する理由は他にも多くあるため、すべての可能性がカバーされているわけではありません。 忘れられたり見過ごされたりすることのある最も基本的な問題について、トラブルシューティングのためのいくつかのヒントが提供されています。 これらの問題は、モバイルの世界および X.509 証明書を扱う際に重要です。

基本概念

認証局 (CA)
証明書を発行するエンティティーです。CA は、他の証明書または他の CA 証明書 (中間 CA 証明書) を発行 (署名) できます。

Public Key Infrastructure (PKI) では、証明書はトラストの階層型チェーンによって検証されます。 このツリーの最上位にある証明書がルート CA 証明書です。

証明書は、公開インターネット CA から購入するか、独自のプライベート (ローカル) CA を構築して、ユーザーおよびアプリケーションのためのプライベート証明書を発行することができます。CA は、クライアントによって十分信頼される機関である必要があります。ほとんどの商用 CA は、ほとんどの Web ブラウザーおよびモバイル・プラットフォームによって自動的に信頼される証明書を発行します。プライベート CA を使用するということは、ユーザーのルート CA によって署名された証明書を、クライアントが確実に信頼するための特定のアクションを実行しなければならないことを意味します。

証明書は、ご使用のモバイル・プラットフォームで認知されている多くのパブリック CA の 1 つによって、プライベート CA によって、またはそれ自体によって署名 (発行) できます。

自己署名証明書
自己によって署名され、その妥当性を保証する CA がない証明書です。

自己署名証明書の使用は、ほとんどのモバイル・プラットフォームでサポートされないため、推奨されません。

自己署名 CA
自己によって署名された CA。これは、証明書であり CA です。これはツリー内の最上位の証明書なので、ルート CA でもあります。

セキュリティー上の理由から、プライベート CA によって署名された証明書をインターネットに接続している外部サーバー上で実動で使用することは推奨されません。 ただし、そういった証明書は、コストが低いため、開発環境およびテスト環境では優先的な選択肢になることがあります。 また、デプロイメントを迅速かつ容易に行えるため、多くの場合、内部 (イントラネット) サーバーに適しています。

さまざまなモバイル・プラットフォームによってサポートされている証明書タイプ

表 1. さまざまなモバイル・プラットフォームによってサポートされている証明書タイプ
プラットフォーム 自己署名証明書 自己署名 CA 証明書 プライベート CA によって署名された証明書 パブリック CA によって署名された証明書
iOS -
Android -
Windows Phone -
Blackberry -
Windows 8 -

iOS によってサポートされている証明書タイプ

表 2. iOS によってサポートされている証明書タイプ
プラットフォーム 自己署名証明書 自己署名 CA 証明書 プライベート CA によって署名された証明書 パブリック CA によって署名された証明書
iOS -

自己署名証明書と自己署名 CA

モバイル・クライアントを扱っているときは、 自己署名証明書を使用することは推奨されません。 なぜなら、モバイル・プラットフォームでは、このようなタイプの証明書をデバイスのトラストストアにインストールすることが許可されないからです。 この制限により、クライアントがサーバーの証明書を信頼することは不可能になります。自己署名証明書は、開発目的およびテスト目的に推奨されることがよくありますが、クライアントがモバイル・デバイスの場合は機能しません。

代替方法は、自己署名証明書の代わりに自己署名 CA 証明書を使用することです。自己署名 CA 証明書は取得が簡単であり、さらに費用効率の高いソリューションです。

自己署名 CA は、ほとんどのツールを使用して作成できます。例えば、以下のコマンドでは、自己署名 CA を作成するために openssl ツールが使用されています。
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt -reqexts v3_req -extensions v3_ca
注: 一部のモバイル・プラットフォームでは、X.509 バージョン 1 証明書は許可されていません。代わりに X.509 バージョン 3 証明書を使用する必要があります。自己署名 CA 証明書を生成する場合は、必ずそれらがタイプ X.509 バージョン 3 であり、拡張 basicConstraints = CA:TRUE が定義されていることを確認してください。必要なバージョンおよび証明書拡張の指定方法については、適切なツールの資料を参照してください。openssl コマンドの場合、バージョン 3 X.509 証明書を示すには -reqexts v3_req フラグを指定し、その証明書が CA でもあることを示すには -extensions v3_ca フラグを指定することができます。
証明書のバージョンと拡張は、次の openssl コマンドを実行して確認することができます。
openssl x509 -in certificate.crt -text -noout

クライアントでの信頼の確立

モバイル・ブラウザーで Web ページを開くか、または HTTPS ポートで MobileFirst Server に直接接続すると、クライアントは SSL ハンドシェークでサーバー証明書を受け取ります。その後、クライアントは、信頼を確立するために、既知のトラステッド CA のリストを使用してサーバー証明書を評価します。各モバイル・プラットフォームには、SSL 証明書の発行に信頼できるトラステッド CA のセットが含まれています。 サーバー証明書が、既にデバイスによって信頼されている CA によって署名されている場合、信頼が確立されます。信頼が確立されると、SSL ハンドシェークが正常に実行され、ブラウザー上で Web ページを開いたり、サーバーに直接接続したりすることが許可されます。

ただし、クライアントが認識していない CA によって署名されている証明書がサーバーで使用されている場合は、信頼は確立されず、SSL ハンドシェークは失敗します。クライアント・デバイスがサーバーの証明書を信頼するようにするためには、クライアント・デバイスにトラスト・アンカー証明書 (ルート CA) をインストールする必要があります。

注: ルート CA 証明書 (トラスト・アンカー) のみをインストールする必要があります。中間証明書などの他の証明書をデバイスにインストールする必要はありません。

iOS については、iOS へのルート CA のインストールを参照してください。

Android については、Android へのルート CA のインストールを参照してください。

Windows Phone については、Windows Phone へのルート CA のインストールを参照してください。

Windows 8 については、Windows Phone へのルート CA のインストールを参照してください。

Android の構成

ユーザーのアプリケーションで次のフラグが true に設定されている場合、特定の条件下で Android が SSL エラーを無視する点に注意することが大切です。
android:debuggable="true"

実稼働環境でのこのフラグの使用は推奨されません。クライアント・デバイスによって信頼されている CA によって署名された証明書を使用してサーバーを正しく構成した場合、これは必要ありません。

証明書チェーンの処理

サーバー自体によって署名されていないサーバー証明書を使用している場合は、サーバーがクライアントに完全な証明書チェーンを送信していることを確認する必要があります。

クライアントが証明書パスを検証するためには、証明書チェーン全体へのアクセス権限を持っている必要があります。 クライアントが、中間証明書を含めて完全な証明書チェーンにアクセスできるようにするには、チェーン内のすべての証明書がサーバー・サイドの鍵ストア・ファイルに含まれていることを確認してください。

WebSphere® Application Server Liberty については、証明書チェーンを使用するための鍵ストアおよび Liberty プロファイル構成の更新を参照してください。

証明書拡張機能の処理

RFC 5280 (およびその先行 RFC) は、証明書に関する追加情報を提供する数多くの証明書拡張を定義しています。証明書拡張は、基本となる X.509 証明書の情報の標準を拡張する手段を提供します。

X.509 証明書に拡張が指定されている場合、その拡張は、それが重大な拡張か重大でない拡張かを指定する必要があります。クライアントが認識していない、またはクライアントが処理できない重大な拡張を持つ証明書を処理しているクライアントは、その証明書を拒否する必要があります。重要でない拡張は、認識されない場合、無視することができます。

すべてのモバイル・プラットフォームが、特定の証明書拡張を同様に認識または処理するわけではありません。この理由により、できるだけ厳密に RFC に従う必要があります。すべてのターゲット・モバイル・プラットフォームが、証明書拡張を予期したとおりに処理できることが判明している場合以外は、証明書拡張の使用を避けてください。

CRL サポート

証明書が証明書取り消しリスト (CRL) をサポートしている場合は、CRL URL が有効かつアクセス可能であることを確認してください。 そうでない場合、証明書チェーンの検証は失敗します。

サーバー証明書の検証に使用するツール

証明書パス検証の問題をデバッグするには、openssl s_client コマンド・ライン・ツールを実行します。 このツールは、SSL 問題をデバッグする際に役立つ有益な診断情報を生成します。

以下の例は、openssl s_client コマンド・ライン・ツールの使用方法を示します。
openssl s_client -CApath $HOME/CAdir -connect hostname:port
以下の例は、証明書の検査方法を示しています。
openssl x509 -in certificate.crt -text -noout

信頼された認証局によって署名されていないサーバー証明書の問題のトラブルシューティング

表 3. サーバー証明書に関する問題のトラブルシューティング
問題 取るべきアクション

iOS にルート CA をインストールできない。

証明書はインストールされるが、インストール後に、その証明書が信頼されていないと iOS に表示される。

証明書が、認証局として識別されていません。次のように証明書が証明書拡張を指定していることを確認してください。
basicaConstraints = CA:TRUE

詳しくは、自己署名証明書と自己署名 CA を参照してください。

証明書が PEM 形式であることを確認してください。

証明書が .crt ファイル拡張子を持っていることを確認してください。

Android にルート CA をインストールできない。

インストール後、システムの信頼済み資格情報に証明書が表示されない。

この証明書は X.509 バージョン 1 証明書であるか、次の証明書拡張を持っていません。
basicConstraints = CA:TRUE

詳しくは、自己署名証明書と自己署名 CA を参照してください。

証明書が PEM 形式または DER 形式であることを確認してください。

証明書が .crt ファイル拡張子を持っていることを確認してください。

"errorCode":"UNRESPONSIVE_HOST","errorMsg":"サービスは現在使用できません"

通常、このエラーは SSL ハンドシェーク障害を示しています。

クライアントは、このサーバー証明書の信頼を確立できません。
  1. クライアント・デバイスにサーバーのルート CA をインストールしていることを確認してください。詳しくは、クライアントでの信頼の確立 を参照してください。
  2. サーバーが、完全な証明書チェーンを正しい順序で送信していることを確認します。詳しくは、証明書チェーンの処理 を参照してください。
サーバー証明書が無効です。
  1. サーバー証明書の妥当性を確認してください。詳しくは、サーバー証明書の検証に使用するツール を参照してください。
  2. CRL URL が有効であり、アクセス可能であることを確認してください。詳しくは、CRL サポート を参照してください。
  3. このサーバー証明書には、クライアント・プラットフォームによって認識されない重大な証明書拡張が含まれています。詳しくは、証明書拡張機能の処理 を参照してください。

SSL が Android では機能するが、iOS では機能しない。

Android が debuggable モードの場合、Cordova はほとんどの SSL エラーを無視します。この動作により、正しく機能しているような印象を受けます。Android が debuggable モードになるのは、APK が署名されていない場合、またはマニフェストで明示的にこのモードを設定した場合です。Android のマニフェスト・ファイルで debuggable フラグが false (debuggable:false) に設定されていることを確認するか、APK に署名してください。debuggable モードに設定する明示宣言がマニフェストにないことを確認してください。Android の構成について詳しくは、Android の構成を参照してください。

インストール後、システムの信頼済み資格情報またはトラストストアに証明書が表示されない。

ご使用のブラウザーから直接保護リソースにアクセスして、サーバー証明書をインストールしていないことを確認してください。このアクションは、証明書をブラウザー・スペースのみにインポートし、デバイス・システムのトラストストアにはインポートしません。唯一必要なことは、ルート CA をインストールすることです。

デバイスへのルート CA の正しいインストール方法について詳しくは、以下のトピックを参照してください。

iOS については、iOS へのルート CA のインストールを参照してください。

Android については、Android へのルート CA のインストールを参照してください。

SCRIPT7002: XMLHttpRequest: Network Error 0x2ee4, Could not complete the operation due to error 00002ee4
  • クライアント・デバイスにサーバーのルート CA をインストールしていることを確認してください。詳しくは、クライアントでの信頼の確立 を参照してください。
  • サーバーが、完全な証明書チェーンを正しい順序で送信していることを確認します。詳しくは、証明書チェーンの処理 を参照してください。