2011-06-22 14 views
11

私はAndroidの周りをケースに入れ、これを持っていなかったチュートリアルフォローをしました:私は私自身のトラストストアを持っていないAndroid経由でSSL接続にアクセスするにはどうすればよいですか?

  1. System.setProperty("javax.net.ssl.trustStore", "truststore"); 
        System.setProperty("javax.net.ssl.trustStorePassword", "password"); 
    
        SSLSocketFactory ssf = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
        try { 
         Socket s = ssf.createSocket("192.168.2.11", 6543); 
         PrintWriter out = new PrintWriter(s.getOutputStream()); 
         while (true){ 
          out.println("SSL TEST"); 
          Log.d("DATA", "DATA SENT"); 
         } 
    
    
    
        } catch (UnknownHostException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
    

    私は、これはいくつかの質問に沸くと思います作成したものの、チュートリアルや物事をオンラインで検索すると、作成方法はわかりません。私がそれに必要な証明書を持つためにトラストストアを作成または変更できる方法はありますか? (私はそれが何か違いがあれば、私は自己署名証明書を使用しています)

  2. 私はSSLハンドシェークでスムーズに動作させる方法を教えてください。今、私が得ているエラーは次のとおりです。

     
    javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 
    

    正に、私はそれがどういう意味を本当に理解していません。

  3. この接続が行われるようにするには、Android搭載端末でどのような設定やファイルを変更する必要がありますか?

+0

Android以外のテクニックを修正するのではなく、Androidの方法から始めましょう。 –

+0

私は自分のサーバから持ってきたキーストアファイルをjdk/jre/lib/securityフォルダに置いてみました。そしてそれにマッチするようにトラストストアの場所とパスワードを変更すると、同じ例外が発生しました。 – Matt

+0

待ち! 「Androidのやり方」とは何ですか? – Matt

答えて

10

1)それに依存します。あなたはサーバ側で自己署名証明書を持っていますか?アンドロイドデバイスへのあなたの身元を確認しようとしていますか?または、あなたのアンドロイド側であなたのアイデンティティーをサーバーに検証しようとしていますか?それが前者の場合は、次のリンクを参照してください。http://www.codeproject.com/KB/android/SSLVerification_Android.aspx?display=Mobile

KeyStoreファイルの作成場所に特に注意してください。

2)このエラーが発生する理由は、トラストストアを正しく作成しなかったか、証明書がサーバーに追加されていないために接続しているサーバーを信頼しないためです。トラストストア。何を接続しようとしていますか?

3)マニフェストファイルに<uses-permission android:name="android.permission.INTERNET" />があることを確認してください。

私の謝罪は、私が最初の段落に行った変更をご覧ください。ここで

は、ピアが自己署名certifictesを使用している場合を除き、あなたはあなた自身のトラストストアを必要としないキーストアを初期化し、

SSLcontext sslContext = SSLContext.getDefault(); 

KeyStore trustSt = KeyStore.getInstance("BKS"); 
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
InputStream trustStoreStream = this.getResources().openRawResource(R.raw.truststore); 
trustSt.load(trustStoreStream, "<yourpassword>".toCharArray()); 
trustManagerFactory.init(trustStre); 

KeyStore keyStore = KeyStore.getInstance("BKS"); 
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
InputStream keyStoreStream = this.getResources().openRawResource(R.raw.keystore); 
keyStore.load(keyStoreStream, "<yourpassword>".toCharArray()); 
keyManagerFactory.init(keyStore, "<yourpassword>".toCharArray()); 

sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null); 
+0

[+1] 1)私は、(このウェブサイトを見る前に)私はキーストアとトラストストアの区別を理解していないと考えています。 2)おそらくトラストストアを正しく作成していない...私はJREのkeytool機能を使用しました 3)私は少なくともこの部分が正しいと思っています:0) – Matt

+1

こんにちは、申し訳ありませんが、最初の段落で間違いを犯しました。 – Otra

+2

トラストストアとキーストアの違いは、トラストストアは信頼できる証明書のリストなので、私がアンドロイド側にいる場合は、トラストストアにサーバー証明書が必要です。キーストアは、サーバーに検証するための資格情報を保持する場所です。サーバー側では、信頼ストアは、信頼するクライアントのリストを保持する場所で、キーストアは自分の資格情報を保持する場所です。 – Otra

1

をトラストストアする部分です。 JREにはデフォルトで使用されるトラストストアが付属しています。トラストストアはすべての主要なCAによって発行された証明書を信頼します。

+2

私は自己署名証明書を使用しています... – Matt

+0

@Mattので、トラストストアを作成する必要があります。 JDKからコピーします。サーバー証明書をファイルにエクスポートします。それを新しいトラストストアにインポートします。 – EJP

関連する問題