2011-01-13 2 views
5

私はAndroidには新しく、Androidアプリケーション用のSSL Webサービスを呼び出すのに苦労しています。次のように私のコードは次のとおりです。Androidに証明書が表示されないときに、Androidで安全な(SSL)Webサービスを呼び出すにはどうすればよいですか?

Log.v("fs", "Making HTTP call..."); 
HttpClient http = new DefaultHttpClient(); 
HttpGet request = new HttpGet("https://example.com/api"); 

try { 

    String response = http.execute(request, new BasicResponseHandler()); 
    Log.v("fs", response); 

} catch (Exception e) { 

    Log.v("fs", e.toString()); 
} 

出力は次のとおりです。

Making HTTP call... 
javax.net.SSLPeerUnverifiedException: No peer certificate 

この作品を作るための任意の提案は素晴らしいことです。

これは有効な証明書であることに注意してください。公式のCAによって署名されています。

+0

SSL証明書は有効ですか、または何らかのdevサーバーを使用していますか? –

+0

多分これはhttp://stackoverflow.com/questions/3761737/https-get-ssl-with-android-and-self-signed-server-certificate –

+0

私はあなたと同じ問題を抱えています。この ? –

答えて

0

これもサーバーの証明書に問題があると思います。 Plsはここに与えられたInstallCert.javaプログラムをチェックアウトします:http://blogs.oracle.com/andreas/entry/no_more_unable_to_find。これは、サーバーの証明書を検証する良い方法です。このプログラムを使用してダウンロードできない場合は、サーバーをもう一度確認してください。
ここでこのプログラムを使用した後に結果を投稿すれば、そこから取得します。

+1

プログラムをコンパイルして実行しました。出力:SSLハンドシェイクを開始しています...エラーはありません。証明書はすでに信頼されています – mmattax

+0

SSL検証を無効にするために送信したリンクを試しましたか?それがうまくいくなら問題の内容を知ることができます。私はgodaddyさんのSSL証明書がちょっとファンキーだったことを思い出します。 –

+0

リンクが死んでいる、他の場所で見つけることはできますか? –

-10

HTTPS Webサービスで取得することはできません。メソッドが許可されているのはPOSTだけです。

+3

これはどこから取得しましたか?あなたはこれを知っていますか、あなたはただ推測していますか? HTTPSの場合でも、すべての標準HTTPメソッドが許可されています。 GETを許可しないと、HTTPS経由でブラウザにアクセスするときにブラウザにWebページを表示できなくなります。 – sven

+4

この回答はとても間違っています。 –

+1

HTTPSとPOSTは異なるレイヤーの2つの異なるものです。 – prageeth

1

以下を試してください。 SSL接続を処理するSSLSocketFactoryを追加しました。さらに、ThreadSafeClientConnManagerを使用して同時に複数の接続を処理するサポートが追加されました。ソケットタイムアウトと接続タイムアウトを削除できます。

SchemeRegistry schemeRegistry = new SchemeRegistry(); 
    schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    schemeRegistry.register(new Scheme("mxiss", SSLSocketFactory.getSocketFactory(), 443)); 

    HttpParams params = new BasicHttpParams(); 
    int timeoutConnection = 5000; 
    HttpConnectionParams.setConnectionTimeout(params, timeoutConnection); 
    int timeoutSocket = 10000; 
    HttpConnectionParams.setSoTimeout(params, timeoutSocket); 
    params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30); 
    params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(30)); 
    params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false); 
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 

    ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); 

    _client = new DefaultHttpClient(cm, params); 

これが役立ちます。

クライアントがサーバー証明書を信頼しない場合は、別のプロトコルを登録し、そのプロトコルのすべての証明書を受け入れます。何かをする前にまずプロトコルを登録する必要があります。そして、代わりの

Protocol mxiss = new Protocol("mxiss", new EasySSLProtocolSocketFactory(), 443); 
Protocol.registerProtocol("mxiss", mxiss); 

"https" を使用すると、 "mxiss"

EasySSLProtocolSocketFactoryがorg.apache.commons.httpclient.contrib.sslから来ているを使用する必要があります。 jarファイルhttp://repo1.maven.org/maven2/ca/juliusdavies/not-yet-commons-ssl/0.3.11/not-yet-commons-ssl-0.3.11.jarをクラスパスに入れてください。

+0

私は同じ問題を抱えていて、あなたの解決策は何の影響もないようです:-(。 – Carsten

+0

私は答えを更新しました再試行してください – prageeth

+1

私の場合、問題は私のアンドロイドデバイスがルートAndroidのFirefoxは独自のルート証明書を使用しているように見えますが、Windowsもそれを信頼していますが、標準の信頼されたCAを使用しているデバイスには問題があります。 – Carsten

2

あなたはSSLを使用している場合は、??あなたがモバイル日時が正しいものであることをテストして、それが

javax.net.SSLPeerUnverifiedException戻ります1990年にあなたの携帯電話を持っている:いいえピア証明書

よろしくお願いします。

1
SchemeRegistry schemeRegistry = new SchemeRegistry(); 
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
schemeRegistry.register(new Scheme("mxiss", SSLSocketFactory.getSocketFactory(), 443)); 


HttpParams params = new BasicHttpParams(); 
int timeoutConnection = 5000; 
HttpConnectionParams.setConnectionTimeout(params, timeoutConnection); 
int timeoutSocket = 10000; 
HttpConnectionParams.setSoTimeout(params, timeoutSocket); 

params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30); 

params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean); 

params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false); 

HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 


ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); 

_client = new DefaultHttpClient(cm, params); 
関連する問題