web-dev-qa-db-ja.com

Android経由でSSL接続にアクセスするにはどうすればよいですか?

Android)に当てはまらないチュートリアルをフォローし始め、次のようになりました。

    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();
    }

私はこれがいくつかの質問に要約されると思います:

  1. 私は自分のトラストストアを作成していませんが、チュートリアルやオンラインのものを検索すると、作成方法がわかりません。トラストストアを作成または変更して、必要な証明書を含める方法はありますか? (違いが生じる場合は、自己署名証明書を使用しています)

  2. SSLハンドシェイクで物事をスムーズに実行するにはどうすればよいですか?現在、私が得ているエラーは次のとおりです。

     javax.net.ssl.SSLHandshakeException:Java.security.cert.CertPathValidatorException:証明書パスのトラストアンカーが見つかりません。
    

    正直なところ、それが何を意味するのかよくわかりません。

  3. この接続を確実に行うには、Androidデバイスでどの設定またはファイルを変更する必要がありますか?

12
Matt

1)状況によります。サーバー側に自己署名証明書があり、Androidデバイスに対してIDを検証しようとしていますか?それともAndroid側にいますか?サーバーへのIDを検証するには?前者の場合は、次のリンクを参照してください: http://www.codeproject.com/KB/Android/SSLVerification_Android.aspx?display=Mobile

KeyStoreファイルを作成する場所に特に注意を払う必要があります。

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

3)manifest.xmlに<uses-permission Android:name="Android.permission.INTERNET" />があることを確認します。

編集申し訳ありませんが、最初の段落に加えた変更をご覧ください。

キーストアとトラストストアを初期化する部分は次のとおりです

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);
11
Otra

ピアが自己署名証明書を使用していない限り、独自のトラストストアは必要ありません。 JREには、デフォルトで使用されるトラストストアが付属しています。このトラストストアは、すべての主要なCAによって発行された証明書を信頼します。

1
user207421