1

開発とテストの目的で自己署名証明書を使用しています。Androidエミュレーターに自己署名証明書を受け入れさせるためのさまざまなアプローチを調査しました。これまでのところ、次のアプローチのバリエーションを見つけました。

  1. 任意の証明書を受け入れる独自のセキュリティ クラスを提供します。
  2. 自己署名公開鍵を含むアプリのキーストアを作成します。
  3. プロパティ socket.relaxsslcheck を yes に設定します。

最初の 2 つのオプションは非常に複雑で、開発、テスト、本番などの環境への依存関係をコードに導入します。

オプション 3 環境構成が動作を駆動するため、コンテナーで実行されているアプリに構成済みのデータソースを提供する Web コンテナーとは異なり、私が気に入っています。開発環境は、開発データソースなどを指します。残念ながら、私はそれを機能させるのに苦労しています。私は次のことを試しました:

  • adb を使用してプロパティを設定する

    adb shell setprop socket.relaxsslcheck yes

  • System.setProperty の使用

    System.setProperty("socket.relaxsslcheck","yes")

  • /system/build.prop と default.prop を変更しようとしました

最初のオプションは無視されます。私が読んだことから、プロパティの設定は再起動後に有効になるようです。しかし、このプロパティは揮発性のようで、エミュレーターの再起動後は存続しません。

System.setProperty(...)Factory は既に作成されているため、このアプローチは遅すぎるようです。上記の懸念 (コード内の開発環境固有のコード) のため、他に方法がない場合を除き、この方法は使用しないことをお勧めします。

最後のオプションは、エミュレーターの再起動に耐えるはずですが、実行した後でもそれらのファイルに書き込むことができませんadb root

私は Android 開発に不慣れで、最善のアプローチとは何か、それを機能させる方法についてのガイダンスをいただければ幸いです。

4

1 に答える 1

1

そのオプションで「yes」を正確に指定する必要があります。つまり、次のようになります。

-prop socket.relaxsslcheck=yes

ソースコードは、プロパティ値を「yes」と比較するだけです(「true」や「1」などの同等の値に対してもテストする必要はありません...)

ADTバンドルを使用して、次の方法でそのオプションを設定しました

Run -> Debug Configurations... -> Android Application -> ProjectName -> Target
  -> Additional Emulator Command Line Options

エミュレータの再起動後、SSLSocketCertificateFactoryアドバタイズされた状態で動作します。つまり、すべての証明書を受け入れます。ログを見ることでそれを確認することができます:

12-08 18:10:52.382: W/SSLCertificateSocketFactory(763): 
  *** BYPASSING SSL SECURITY CHECKS (socket.relaxsslcheck=yes) ***

自分で作成した証明書を使用してテストしました。プロパティセットを使用しないと、証明書の検証エラーで接続が失敗し、そのプロパティセットを使用すると(または使用してSSLCertificateSocketFactory.getInsecure())、TLSソケットは正常に接続されます。

ところで、SSLSocketCertificateFactory時々使用するのは難しいようです-たとえば、私はそのファクトリから実際のインスタンスを取得するのに苦労しています-人々は基本的に次のような回避策を投稿しています:そのファクトリを無視します。一部の人々の周りをグーグルで検索すると、そのファクトリをまったく使用しないことをお勧めしますが、多くの理由はありません。

于 2012-12-08T18:34:41.007 に答える