このトピックでは、Host ヘッダーに基づいてトラフィックをルーティングする HTTP プロキシ経由でメッセージを送受信するメッセージ プロキシを構成する方法について説明します。HTTP フォワード プロキシは、バックエンド サービス エンドポイントを構成できないモバイル アプリケーションや、バックエンド サービスへの接続に使用するホストとポートを変更するための構成オプションがないテスト対象アプリケーションで使用するのが最適です。

このセクションの内容: 

接続設定

基本的な HTTP フォワード プロキシ接続オプションを指定するには、次のサービスおよびリスニング詳細を設定します。

プロキシ設定 (受信) 

テスト対象アプリケーションと通信するために、クライアントからのメッセージが接続する場所を指定します。 

フォワード プロキシ

ドロップダウン メニューからプロキシ作成時に定義したフォワード プロキシ HTTP リスナーを選択するか (「プロキシの作成」を参照)、新しい フォワード プロキシ HTTP リスナーを追加します。

このダイアログからフォワード プロキシ HTTP リスナーを追加するには、次の操作を行います。

  1. [新規] をクリックします。
  2. リスナーの名前とポートを指定します。
  3. [OK] をクリックします。
ホスト

トラフィックを監視するサービスのホスト名を指定します。これにより、どのホストが記録されるか、ライブ サービスに送信されるか、仮想アセットに送信されるかが決まります。 

すべてのトラフィックの監視を許可するには、ドロップダウン メニューから [All] を選択します。

パス

リソースで監視するパスを入力します。これは、[ホスト]フィールドに入力された内容と連動して、受信リクエストと照合します。

ワイルドカードは使用できません。ホスト上のすべてのパスに一致させるには、このフィールドを空白のままにするか、ドロップダウン メニューから [All] を選択します。

受信リクエストに一致する複数のプロキシ接続が設定されている場合、最も一致するホストと最も長いパスの一致が選択され、ホストの一致がより重視されます。たとえば、https://parabank.parasoft.com/parabank/services/bank/customers/12212 という受信ターゲット URL とそれに一致する 4 つのプロキシがあるとします。

  1. ホスト: parabank
    パス: /parabank
  2. ホスト: parabank.parasoft
    パス: /parabank/services/bank/customers
  3. ホスト: parabank.parasoft.com
    パス: /parabank/services_proxy
  4. ホスト: parabank.parasoft.com
    パス: /parabank/services

このような状況では、プロキシ #4 が選択されます。これは、#2 の方がパスがより正確に一致しているにもかかわらず、#4 の方がホストと一致しており、#3 とは異なり、少なくとも部分的なパスが一致しているためです。

プライマリ接続 (送信) およびセカンダリ接続 (送信)

サービス URLターゲット アプリケーションの完全な URL が表示されます (サービス ホスト、サービス ポート、サービス転送パスを合成したものです)。ここで URL 全体を入力するか、または関連するフィールドで個々のコンポーネントを編集します。1 つのエリアで行われた変更は、他のエリアにも波及します (つまり、サービス URL フィールドのポートを変更すると、サービス ポート フィールドの値も自動的に変更されます)。 
サービス ホスト

サービスが存在するマシンのホスト名を入力します。プロキシがメッセージを送信するマシンです。

HTTP 接続を消費せずにローカル サーバーの仮想アセットに転送するには、実際のホスト名ではなく、host.virt.internallocalhost または 127.0.0.1 を入力します。localhost または 127.0.0.1 を使用する場合、サービス ポートは Virtualize がデプロイされているポートと一致する必要があります。host.virt.internal を使用する場合、サービス ポートは使用されません。たとえば、http://localhost:9080/myVirtualAsset にデプロイされた仮想アセットには、http://host.virt.internal/myVirtualAsset を使用してアクセスすることもできます。

サービス ホストは、クライアントが要求した元のホストにリクエストをルーティングする [Passthrough] に設定することも、仮想アセットまたはメッセージ プロキシによって処理されるようにリクエストを Virtualize にルーティングする [Virtualize] に設定することもできます。 ドロップダウン メニューからいずれかのオプションを選択します。

サービス ポートサービスがリスンしているポートを入力します。プロキシがメッセージを送信するポートです。
サービス転送パス

(任意) プロキシが受信したメッセージを転送する先となるパスを入力します。空白の場合、プロキシはメッセージを変更せずに元の受信パスに沿って転送します。

プロキシがメッセージを localhost に送信する場合、プロキシは自分自身に転送できないため、サービス転送パスに入力する必要があります。 

[サービス転送パス] がリダイレクトを送信する場合、プロキ シはリダイレクトを追跡し、応答します。クライアントにはリダイレクトを渡しません。

オプション

モード: プライマリ接続とセカンダリ接続が存在する場合に、アクティブな転送接続を設定できます。たとえば、記録セッション中に、メッセージ プロキシはプライマリ接続としてライブ サービスに転送し、セカンダリ接続として仮想サービスにフォールバックする場合があります。この場合、HTTP モードをプライマリに設定し、[Use other connection if selected mode fails] を有効にすることができます。

記録が完了し、新しい仮想アセットが生成されたら、プロキシを再設定して、最初に仮想サービスに転送し、障害が発生した場合はライブサービスにフォールバックするようにすると良いでしょう。この変更は、プロキシを右クリックして、HTTPモードを「セカンダリ」に切り替えることですぐに適用できます。フェイルオーバーは実行時にそれに応じて調整されます。

Use other connection if selected mode fails: アクティブな接続 (上で選択したモードによって決定される) が失敗したときに、トラフィックをバックアップ プロキシ エンドポイントにリダイレクトしたい場合は、このオプションを有効にします。レスポンスのステータス コードが 400 レベル以上の場合、接続は " 失敗した" と見なされます。

このオプションが無効な場合、アクティブな接続が記録に使用されます。

このオプションが有効な場合は、[記録] ドロップダウンから記録オプションを選択します。

  • 両方の接続: プライマリ接続とセカンダリ接続の両方のトラフィックを記録します。アクティブな接続からレポートされたエラー メッセージは記録されません。メッセージはバックアップ接続に送信され、レスポンスが記録されます。バックアップ接続からレポートされたエラーは記録されます。
  • プライマリ接続のみ: アクティブな接続のトラフィックを記録します。エラーは記録しません。
  • セカンダリ接続のみ: エラーも含め、バックアップ接続のトラフィックを記録します。

例: サービスにトラフィックを送信する

Http://parabank.parasoft.com でアクセスされるサービスにメッセージを作成したいと仮定します。次の設定で HTTP フォワード プロキシを作成できます。 

  • ホスト: parabank.parasoft.com
  • サービス ホスト: [Passthrough]

この構成は、ホスト parabank.parasoft.com に送信されるトラフィックを監視し、トラフィックを通常どおりライブ サービスに渡します。

トラフィックを別のサービス ホストとポートにリダイレクトする場合は、次のようにプロキシの構成を変更できます。

  • サービスホスト: coyote.parasoft.com
  • サービス ポート: 8080
  • サービス転送パス: [空]  

これにより、parabank.parasoft.com 宛てのトラフィックが coyote.parasoft.com:8080 の別のサービスにルーティングされます。

例: 仮想アセットにトラフィックを送信する

プロキシはトラフィックを仮想アセットへ送ることもできます。host.virt.internal のようなローカル仮想ホストまたは組込みの [Virtualize] オプションをサービス ホストとして使用することで、HTTP 接続を使用せずにローカル サーバー上の仮想アセットに転送できます (詳細については前述の「プライマリ接続 (送信) およびセカンダリ接続 (送信)」 を参照)。

これを行う 1 つの方法は、プライマリ発信接続を host.virt.internal に変更して、トラフィックをローカル サーバー上の仮想アセットに送信することです。 

  • サービスホスト: host.virt.internal
  • サービス ポート: 9080
  • サービス転送パス: /path

あるいは、セカンダリ接続はデフォルトでローカルの仮想アセットを指すように構成されているため、モードをプライマリからセカンダリに単純に変更するという方法もあります。 

  • サービス ホスト: [Virtualize]
  • サービス転送パス: /path
  • モード: Secondary

モバイル エミュレーターでの Parasoft Root Certificate Authority のインストール

モバイル エミュレーターで HTTP フォワード プロキシを使用する前に、信頼できる証明書として Parasoft Root Certificate Authority をインストールする必要があります。この証明書認証局がインストールされていない場合、ブラウザーは接続がセキュアであるとみなさないため、接続を拒否する場合があります。

Android エミュレーター

iOS エミュレーター

Android エミュレーター

この手順では、Android Studio/Android Sdk を使用しており、非運用ビルドで Android Virtual Device (AVD) が作成済みであることを前提としています。さらに:

  • AVD のプロキシ設定が Parasoft 用に構成されていること。プロキシでエミュレーターを使用する方法の詳細については、https://developer.android.com/studio/run/emulator-networking#proxy を参照してください。
  • Android Sdk エミュレーターと adb 実行可能ファイルを $PATH 変数に追加済みであること。

Android の CA 証明書は、ハッシュ名に拡張子.0を付けて保存されるため、Parasoft の証明書をコピーして名前を変更する必要があります。そのためには、コマンドプロンプトを開き、<VIRT_INSTALL_DIR>/plugins/com.parasoft.ptest.libs.web_<version>/root/lib に移動して、次のコマンドを実行します。

hashed_name=`openssl x509 -inform PEM -subject_hash_old -in parasoft.cer | head -1` && cp parasoft.cer $hashed_name.0

/system/etc/security/cacerts/ にある Android ファイル システムのシステム証明書ストアに、hash.0 版の CA 証明書を配置する必要があります。ただし、/system パーティションはデフォルトで読み取り専用としてマウントされるため、まず権限を変更する必要があります。その方法は、使用しているエミュレーターのバージョンによって異なります。

API Level 29 以降

API Level 29 からは、"/" パーティションを read-write 権限で普通にマウントすることができなくなりました。Google は回避策を提供していますが (詳しくは https://android.googlesource.com/platform/system/core/+/master/fs_mgr/README.overlayfs.md を見てください)、これが原因でエミュレーターが起動ループに陥いるケースも見られます。その場合は、以下で説明する回避策を試すことができます。

証明書を使用するには、-writable-system オプションを使用してエミュレーターを起動する必要があります。そうしないと、Android は「クリーンな」システム イメージをロードします。

  1. AVD を開始します:

    emulator -avd <AVD_NAME> -writable-system
    • AVD の名前がわからない場合は、 emulator -list-avds を実行して、すべての AVD のリストを取得します。
  2. root として adb を再起動します:

    adb root
  3. セキュア ブート検証を無効にします: 

    adb shell avbctl disable-verification
  4. デバイスを再起動し、root として adb を再起動します: 

    adb reboot adb root
  5. パーティションを read-write として再マウントします: 

    adb remount
    • adb から再起動が必要と示された場合は、adb rebootadb remount を再度実行します。

  6. hash.0 版の証明書をプッシュします: 

    adb push <PATH_TO_CERT> /system/etc/security/cacerts
  7. 証明書のアクセス権限を設定します: 

    adb shell chmod 664 /system/etc/security/cacerts/<NAME_OF_HASH.0_CERT>
  8. デバイスを再起動します: 

    adb reboot

API Level 28 以下

証明書を使用するには、-writable-system オプションを使用してエミュレーターを起動する必要があります。そうしないと、Android は「クリーンな」システム イメージをロードします。

  1. AVD を開始します:

    emulator -avd <AVD_NAME> -writable-system
    • AVD の名前がわからない場合は、 emulator -list-avds を実行して、すべての AVD のリストを取得します。
  2. root として adb を再起動します:

    adb root
  3. パーティションを read-write として再マウントします: 

    adb remount
    • adb から再起動が必要と示された場合は、adb rebootadb remount を再度実行します。

  4. hash.0 版の証明書をプッシュします: 

    adb push <PATH_TO_CERT> /system/etc/security/cacerts
  5. 証明書のアクセス権限を設定します: 

    adb shell chmod 664 /system/etc/security/cacerts/<NAME_OF_HASH.0_CERT>
  6. デバイスを再起動します: 

    adb reboot

iOS エミュレーター

  1. ファイル サーバーで parasoft.cer ファイルをホストするか、iOS エミュレーターが受信できるアドレスに parasoft.cer ファイルを電子メールで送信します。parasoft.cer ファイルは <VIRT_INSTALL_DIR>/plugins/com.parasoft.ptest.libs.web_<version>/root/lib. にあります。
  2. ブラウザーを開いて parasoft.cer ファイルの URL にアクセスするか、電子メールを開いてダイアログの指示に従い、構成プロファイルを受け入れます。
  3. [設定] > [全般] > [デバイス管理] に移動し、[Parasoft Root Certificate Authority] を選択します。デフォルト設定のままインストール ダイアログをクリックしていきます。

最近の iOS バージョンでは、Parasoftルート証明書を完全に信頼できるようにする必要があります。そのためには:

  1. [設定] > [全般] > [バージョン情報] > [Certificate Trust Settings] に移動します。
  2. [Enable full trust for root certificates] で、Parasoft 証明書の信頼を有効にします。


  • No labels