2011-03-28 7 views
7

私は現在、Android(2.2)用のクライアント部分とSSLを使用するサーバを作成しています。私はサーバと通常のクライアントとの間でメッセージを交換することができましたが、Androidは自己署名証明書についてあまりにも幸せではないようです。 私はStackoverflowとGoogled A LOTを検索し、多くの人が同様の問題を抱えています。これまで私が見つけたすべての答えは働いていなかったか、あるいは意味を持たなかった。コードサンプルのほとんどはHTTPS用ですが、ソケットを介して通信する必要があるため、これは使用できません(SSLSocketは私の推測と同じです)。私はさまざまなコードを試しましたが、今はもうちょっとゼロに戻ります。Android上のSSLクライアント

これまでのところ、私は証明書を作成しなければならないことを理解しました。明らかに私は実際の役に立つコードを見つけることができませんでした。なぜなら、本当に役に立つ人が多いからです。

私は何をすべきかについての詳細な説明と、動作するAndroidクライアントコードにすることができるいくつかのコードを探しています。

ありがとうございます。

答えて

1

私はネイティブのアンドロイドブラウザを移植しています。 SSLコンテキストの作成方法を変更しました。 私はまたSandroBサイト上でいくつかの作業例を置くことを約束したが... :)

https://market.android.com/details?id=org.sandrob

http://code.google.com/p/sandrob/source/browse/misc/examples/HttpsConnection.java

+0

ご返信ありがとうございます。私はあなたがリンクしたコードを見てきました。それは面白いようです。問題は、多くのクラスを使用していることです。これはカスタムメイドのようです。私はGoogle上でそれらのいくつかを調べ、それらが他の図書館で実装されていることがわかりました。 CertificateChainValidatorはパッケージandroid.net.httpにあると思われますが、そこにはありません。 標準ライブラリを使用して、完全な単純化されたサンプルがありますか? – Casper

1

CertificateChainValidatorは、Androidのソースの一部です。 少なくともバージョン/タグ2.2.1_r1

アンドロイドソースからブラウザをビルドし、どのように変更するかは、 HttpsConnection.javaファイルでSSLContextを初期化することができます。

keyManagers(cerfile/passwordで初期化)とtrustManagers(trust all)が必要です。

sslContext.engineInit(keyManagers、trustManager、null、cache、null);

+1

こんにちは。私はそれをインポートするように見えることはできませんし、http://developer.android.com/reference/android/net/http/package-summary.htmlによると、関数は存在しないようです。 私が知る限り、証明書を扱う税関マネージャーを作る必要がありますが、私はまだいくつかの作業コードを見つけています。私はAndroid 2.2(API 8)を使っています。 – Casper

1
public class MySSLSocketFactory extends SSLSocketFactory { 
    SSLContext sslContext = SSLContext.getInstance("TLS"); 

    public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { 
     super(truststore); 

     TrustManager tm = new X509TrustManager() { 
      public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
      } 

      public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
      } 

      public X509Certificate[] getAcceptedIssuers() { 
       return null; 
      } 
     }; 

     sslContext.init(null, new TrustManager[] { tm }, null); 
    } 

    @Override 
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { 
     return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); 
    } 

    @Override 
    public Socket createSocket() throws IOException { 
     return sslContext.getSocketFactory().createSocket(); 
    } 
} 

そして、あなたのHttpClient

public HttpClient getNewHttpClient() { 
     try { 
      KeyStore trustStore = KeyStore.getInstance(KeyStore 
        .getDefaultType()); 
      trustStore.load(null, null); 

      SSLSocketFactory sf = new MySSLSocketFactory(trustStore); 
      sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

      HttpParams params = new BasicHttpParams(); 
      HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
      HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 

      SchemeRegistry registry = new SchemeRegistry(); 
      registry.register(new Scheme("http", PlainSocketFactory 
        .getSocketFactory(), 80)); 
      registry.register(new Scheme("https", sf, 443)); 

      ClientConnectionManager ccm = new ThreadSafeClientConnManager(
        params, registry); 

      return new DefaultHttpClient(ccm, params); 
     } catch (Exception e) { 
      return new DefaultHttpClient(); 
     } 
    } 

は、それはあなたのお役に立てば幸いです。