Я пытаюсь реализовать DynamoDBMapper от AWS, но приложение сработает, когда я пытаюсь подключиться к серверам AWS.Ошибка AWS DynamoDbMapper ... вызвано: javax.net.ssl.SSLProtocolException:
Для запуска я запускаю Android 4.4.2 на эмуляторе Android Studio, и все работает нормально. Проблем нет. Тем не менее, когда я пытаюсь запустить на реальном устройстве (бег 4.4.2 на Tablet ... не знаю производителя), я получаю следующее сообщение об ошибке:
Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x6bffcdf0:
Failure in SSL library, usually a protocol error error:140740B5:SSL
routines:SSL23_CLIENT_HELLO:no ciphers available (external/openssl/ssl/s23_clnt.c:486 0x68474ce0:0x00000000)
Вот полный трассировки стека:
Caused by: com.amazonaws.AmazonClientException: Unable to execute HTTP request: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x6bffcdf0: Failure in SSL library, usually a protocol error error:140740B5:SSL routines:SSL23_CLIENT_HELLO:no ciphers available (external/openssl/ssl/s23_clnt.c:486 0x68474ce0:0x00000000)
com.amazonaws.http.AmazonHttpClient.executeHelper AmazonHttpClient.java:421
com.amazonaws.http.AmazonHttpClient.execute AmazonHttpClient.java:196
com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.invoke AmazonDynamoDBClient.java:3257
com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.getItem AmazonDynamoDBClient.java:904
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load DynamoDBMapper.java:393
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load DynamoDBMapper.java:466
com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.load DynamoDBMapper.java:340
@@@@[email protected]@@@@[email protected]@@@[email protected]@@@.doInBackground MainActivity.java:1259
@@@@[email protected]@@@@[email protected]@@@[email protected]@@@.doInBackground MainActivity.java:1237
android.os.AsyncTask$2.call AsyncTask.java:288
java.util.concurrent.FutureTask.run FutureTask.java:237
... 4 more
Последовал:
Caused by: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x6bffcdf0: Failure in SSL library, usually a protocol error error:140740B5:SSL routines:SSL23_CLIENT_HELLO:no ciphers available (external/openssl/ssl/s23_clnt.c:486 0x68474ce0:0x00000000)
com.android.org.conscrypt.NativeCrypto.SSL_do_handshake Native Method
com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake OpenSSLSocketImpl.java:406
com.android.okhttp.Connection.upgradeToTls Connection.java:146
com.android.okhttp.Connection.connect Connection.java:107
com.android.okhttp.internal.http.HttpEngine.connect HttpEngine.java:294
com.android.okhttp.internal.http.HttpEngine.sendSocketRequest HttpEngine.java:255
com.android.okhttp.internal.http.HttpEngine.sendRequest HttpEngine.java:206
com.android.okhttp.internal.http.HttpURLConnectionImpl.execute HttpURLConnectionImpl.java:345
com.android.okhttp.internal.http.HttpURLConnectionImpl.connect HttpURLConnectionImpl.java:89
com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream HttpURLConnectionImpl.java:197
com.android.okhttp.internal.http.HttpsURLConnectionImpl.getOutputStream HttpsURLConnectionImpl.java:254
com.amazonaws.http.UrlHttpClient.writeContentToConnection UrlHttpClient.java:128
com.amazonaws.http.UrlHttpClient.execute UrlHttpClient.java:65
com.amazonaws.http.AmazonHttpClient.executeHelper AmazonHttpClient.java:353
... 14 more
А вот мой исходный код:
BasicAWSCredentials awsCredentials = new BasicAWSCredentials("abcdef12345","blahblahblah");
AmazonDynamoDBClient dynamoDBClient = new AmazonDynamoDBClient(awsCredentials);
DynamoDbMapper dbMapper = new DynamoDBMapper(dynamoDBClient);
//.... then eventually .....
AWSDriverNameTable awsDriverNameTable = dbMapper.load(AWSDriverNameTable.class, merchantID);
Это последняя строка кода, где начинается ошибка.
Теперь я посмотрел на SO и несколько поисковых систем и узнал, что некоторые устройства Android возвращаются к SSL v3, а сервер, к которому я пытаюсь подключиться, использует TLS v1.0 (перешел на www.ssllabs .com и выяснил, что он использует TLS 1.0). Вот другой SO вопрос, где кто-то, кажется, решена проблема очень похожа на это:
How to disable SSLv3 in android for HttpsUrlConnection?
Таким образом, если это то, что вызывает проблемы (SSLv3 необходимости быть удалены), как я могу идти о настройка AmazonDynamoDbClient для использования только TLS 1.0? Я заметил, что вы можете создать ClientConfiguration и использовать:
clientConfiguration.getApacheHttpClientConfig().setSslSocketFactory(NoSSLv3SocketFactory);
и поставлять его с awsCredentials в конструкторе AmazonDynamoDbClient. Но, он принимает:
org.apache.http.conn.ssl.SSLSocketFactory
не
javax.net.ssl.SSLSocketFactory
что и используется в ответе из ссылки я предоставил (не говоря уже о Android Студия информирует меня, что org.apache.http.conn .ssl.SSLSocketFactory устарел).
Во всяком случае, любая помощь с этим вопросом была бы высоко оценена. Благодаря!
Что AWS SDK вы используете? – Yangfan
Я добавил это к моему Gradle файла: компиляции 'com.amazonaws: AWS-андроида-СДК-ядро: 2. +' компиляции 'com.amazonaws: AWS-андроида-СДК-Cognito: 2. + compile 'com.amazonaws: aws-android-sdk-s3: 2. +' compile 'com.amazonaws: aws-android-sdk-ddb: 2. +' compile 'com.amazonaws: aws-android-sdk- ddb-mapper: 2. + ', поэтому он должен быть последним. Кроме того, я добавил: скомпилировать файлы ('libs/aws-java-sdk-1.10.45.jar') в мой проект, чтобы я мог использовать ClientConfiguration, у которого был метод getApacheHttpClientConfig(). – SydStorm
Вы не поддерживаете использование aws-java-sdk, который не предназначен для Android. FYI AWS SDK для Android использует HttpURLConnection как стандартную HTTP-библиотеку. SSLv3 устарел для всех служб AWS. По какой-то причине ваше устройство не может вести переговоры с протоколом TLSv1.0 +. Теоретически TLSv1.0 должен поддерживаться. Я предлагаю вам попробовать его на другом устройстве. – Yangfan