Roel
Roel

Reputation: 3096

SSLProtocolException in Appengine Endpoints Android client on 1 of 31 clients

I use an generated app engine Android client (jar lib). There are no problems on 30 of the 31 clients. But one Samsung tablet refuses to connect and gives this crash:

Android: 4.4.4 Manufacturer: samsung Model: SM-T533 - Date: Mon Aug 03 09:49:03 CEST 2015

javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x743164d0: Failure in SSL library, usually a protocol error error:1407743E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert inappropriate fallback (external/openssl/ssl/s23_clnt.c:744 0x74509f1c:0x00000000) at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:449) at com.android.okhttp.Connection.upgradeToTls(Connection.java:146) at com.android.okhttp.Connection.connect(Connection.java:107) at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294) at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255) at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206) at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345) at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296) at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:503) at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:136) at com.google.api.client.http.javanet.NetHttpResponse.(NetHttpResponse.java:37) at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:94) at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:972) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469) at nl.stackoverflow.question.RestoreDataLoader.loadInBackground(RestoreDataLoader.java:37) at nl.stackoverflow.question.RestoreDataLoader.loadInBackground(RestoreDataLoader.java:20) at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:312) at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:69) at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:57) at android.os.AsyncTask$2.call(AsyncTask.java:288) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:841) Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x743164d0: Failure in SSL library, usually a protocol error error:1407743E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert inappropriate fallback (external/openssl/ssl/s23_clnt.c:744 0x74509f1c:0x00000000) at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method) at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:406) ... 25 more

ApiUtils class:

/**
 * Sales API Utility functions
 *
 * Created by Roel de Brouwer on 29-4-2015.
 */
public class ApiUtils {

    public static final String APP_NAME = BuildConfig.APP_NAME;
    public static final String WEB_CLIENT_ID = BuildConfig.WEBCLIENT_ID;
    public static final String AUDIENCE = "server:client_id:" + WEB_CLIENT_ID;
    /**
     * Class instance of the HTTP transport.
     */
    public static final HttpTransport HTTP_TRANSPORT = AndroidHttp.newCompatibleTransport();
    /**
     * Class instance of the JSON factory.
     */
    public static final JsonFactory JSON_FACTORY = new AndroidJsonFactory();

    private Context mContext;
    private String mAccountName;

    public ApiUtils(Context context, String accountName){
        this.mContext = context;
        this.mAccountName = accountName;
    }


    private GoogleAccountCredential getCredential(){
        GoogleAccountCredential credential = GoogleAccountCredential.usingAudience(mContext, AUDIENCE);
        credential.setSelectedAccountName(mAccountName);
        return credential;
    }


    /**
     * Retrieve a Sales api service handle to access the API.
     */
    public Sales getApiServiceHandle() {
        // Use a builder to help formulate the API request.
        Sales.Builder salesAPI = new Sales.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredential());
        Log.d("RootURL", salesAPI.getRootUrl());
        salesAPI.setApplicationName(APP_NAME);
        return salesAPI.build();
    }

    /**
     * @return Sales Api
     */
    public Sales.SalesAPI getApi(){
        return getApiServiceHandle().salesAPI();
    }
}

Upvotes: 1

Views: 385

Answers (1)

Roel
Roel

Reputation: 3096

Updating the tablet to the latest OS version (crippled by Samsung) fixed the problem. (Still based on Android 4.4.4)

Upvotes: 1

Related Questions