1

しばらくの間、この問題の解決策を探していましたが、理解できないようです

Android アプリとサーバーの間で http 接続を介して ssl を使用しようとしています。自己署名証明書を使用してキーストアを作成しました。

私はこのコードを持っています:

    URL url;
    SSLContext sslContext = null;
    KeyStore keyStore = KeyStore.getInstance("BKS");    
    InputStream input = SportsApplication.getContext().getResources().openRawResource(R.raw.mykeystore);
    keyStore.load(input, "mypass".toCharArray());
    KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
    kmf.init(keyStore, "mypass".toCharArray());
    KeyManager[] keyManagers = kmf.getKeyManagers();
    sslContext = SSLContext.getInstance("TLS");
    sslContext.init(keyManagers, null, null);

    HttpsURLConnection connection = null;
    String urlParameters = mJObject.toString();
    try {
        Log.w("client", mUrl);
        Log.v("client", "request: "+urlParameters);
        // Create connection
        mUrl = mUrl.replaceFirst("http", "https");
        url = new URL(mUrl);
        connection = (HttpsURLConnection) url.openConnection();
        try{

            connection.setSSLSocketFactory(sslContext.getSocketFactory());
        }
        catch (Exception e1) {
            e1.printStackTrace();
            int tx =0;
        }
        try{
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-type", "application/json");
        connection.setRequestProperty("Accept", "application/json");
        connection.setReadTimeout(dataTimeout);
        connection.setConnectTimeout(com.inmobly.buckeyes.client.Constants.DEFAULT_CONN_TIMEOUT);

        connection.setUseCaches(false);
        connection.setDoInput(true);
        connection.setDoOutput(true);
        }
        catch (Exception e1) {
            e1.printStackTrace();
            int tx =0;
        }
        // Send request
        DataOutputStream wr = null;
        try{
         wr = new DataOutputStream(connection.getOutputStream());
        }
        catch (Exception e1) {
            e1.printStackTrace();
            int tx =0;
        }

しかし、私はこの例外を受け取り続けます:

javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x1b1b0e0: Failure in SSL library, usually a protocol errorerror:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:683 0x4029bcf5:0x00000000)

私は何を間違っていますか?

4

2 に答える 2

1

SSL ハンドシェイク自体は実行されないため、例外の情報を使用してデバッグする代わりに、システムに Wireshark をインストールし (これはシミュレーターでも再現可能です)、OS レベルでのパケット キャプチャを確認できます。サーバーとクライアントでの SSL 実装間のプロトコル バージョンの不一致が原因でエラーが発生した場合、パケットには必要な情報が含まれているはずです。サーバーとのハンドシェイクが適切に行われることを確認するために、最初に単純な SSL ハンドシェイクを試すことができます。取得した情報をお知らせください。さらにデバッグします。

于 2013-11-12T17:51:57.780 に答える
0

Android の HttpsUrlConnection で SSLv3 を無効にする方法の私の回答を参照してください。

于 2015-04-29T14:15:12.890 に答える