1

Android から SSL レスト サービスに接続しようとしています。サーバーは、一般的な CA (Thawte、Verisign...) からのものではない SSL 証明書を使用します。

この例を使用して先に進みました: http://blog.antoine.li/2010/10/22/android-trusting-ssl-certificates/

ただし、前述のすべての手順 (BKS プロバイダーの作成、カスタム SchemeRegistry の作成) を実行しましたが、まだ「ピア証明書がありません」というエラーが表示されます。

サービスを呼び出すコード (AsyncTask から):

DefaultHttpClient client = new MyHttpClient(mainActivity[0].getApplicationContext());
HttpGet get = new HttpGet("<url of the service>");
get.addHeader("Autorization","Basic YW5kcm9pZDo=");
// Execute the GET call and obtain the response
HttpResponse getResponse;
try {
  getResponse = client.execute(get);
  ....

MyHttpClient のコードはブログの例と同じです。client.execute(get) を実行すると、execption でクラッシュします。

01-06 21:47:03.615: W/System.err(19289): javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
01-06 21:47:03.625: W/System.err(19289):    at org.apache.harmony.xnet.provider.jsse.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:137)
01-06 21:47:03.630: W/System.err(19289):    at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:93)
01-06 21:47:03.635: W/System.err(19289):    at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381)
01-06 21:47:03.640: W/System.err(19289):    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:165)
01-06 21:47:03.645: W/System.err(19289):    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
01-06 21:47:03.645: W/System.err(19289):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
01-06 21:47:03.645: W/System.err(19289):    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
01-06 21:47:03.650: W/System.err(19289):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
01-06 21:47:03.650: W/System.err(19289):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
01-06 21:47:03.650: W/System.err(19289):    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
01-06 21:47:03.650: W/System.err(19289):    at validatedid.helloworldandroid.DownloadDevicePendingDocsTask.doInBackground(DownloadDevicePendingDocsTask.java:41)
01-06 21:47:03.650: W/System.err(19289):    at validatedid.helloworldandroid.DownloadDevicePendingDocsTask.doInBackground(DownloadDevicePendingDocsTask.java:1)
01-06 21:47:03.655: W/System.err(19289):    at android.os.AsyncTask$2.call(AsyncTask.java:264)
01-06 21:47:03.655: W/System.err(19289):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
01-06 21:47:03.655: W/System.err(19289):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
01-06 21:47:03.655: W/System.err(19289):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
01-06 21:47:03.660: W/System.err(19289):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
01-06 21:47:03.660: W/System.err(19289):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
01-06 21:47:03.660: W/System.err(19289):    at java.lang.Thread.run(Thread.java:856)

サーバーからのエラーである可能性があると言う場所もありますが、それを確認する方法がわかりません。どんな助けでも本当に感謝しています。

前もって感謝します。

4

2 に答える 2

1

stackoverflow を詳しく調べると、問題の解決策が見つかります。

http://blog.antoine.li/2010/10/22/android-trusting-ssl-certificates/のコードを使用する だけでは十分ではないようです (少なくとも私にとっては)。

SSLSocketFactory はサブクラス化する必要があります。完全な説明: HTTPS 経由で HttpClient を使用してすべての証明書を信頼する

誰かがここに到着した場合に備えて、ここに答えを残しておきます。

Android の次のバージョンでは、https を使用して残りのサービスにアクセスする簡単な方法になることを願っています。

于 2013-01-07T12:33:57.993 に答える
0

私は -> this <- を使用して、証明書またはホストの検証を無効にすることなく、私の Https 自己署名証明書接続を確立したので、SSL pov から本当に安全です。

再開するには、アプリにカスタム キーストアを作成して、アプリのキーストアに対してサーバーの HTTP を検証できるようにする必要があります。

SSL 検証を無効にすることがこの種の質問に対する正しい答えであると考えている人が多すぎるのは残念です。実際、SSL の要点はセキュリティと検証です。検証を回避する場合は、プレーンな HTTP に固執してください。

私が最近別の質問で行ったこの回答を参照してください

于 2013-03-20T16:03:31.007 に答える