2016-01-12 3 views
0

Я пытаюсь реализовать 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 устарел).

Во всяком случае, любая помощь с этим вопросом была бы высоко оценена. Благодаря!

+0

Что AWS SDK вы используете? – Yangfan

+0

Я добавил это к моему 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

+0

Вы не поддерживаете использование aws-java-sdk, который не предназначен для Android. FYI AWS SDK для Android использует HttpURLConnection как стандартную HTTP-библиотеку. SSLv3 устарел для всех служб AWS. По какой-то причине ваше устройство не может вести переговоры с протоколом TLSv1.0 +. Теоретически TLSv1.0 должен поддерживаться. Я предлагаю вам попробовать его на другом устройстве. – Yangfan

ответ

0

Некоторые услуги, такие как поддержка Cognito TLSv1.0 +, в то время как некоторые говорят, что DynamoDB поддерживает только TLSv1.0 (не выше). Если ваше устройство поддерживает TLSv1.0, оно должно работать тогда. Поскольку вы сказали, что код работает на эмуляторе, но не на планшете, трудно сказать, где проблема. Я предлагаю вам попробовать следующее:

  • В браузере: https://dynamodb.us-west-2.amazonaws.com. Если ваше устройство может обрабатывать TLSv1.0, вы должны увидеть healthy: dynamodb.us-west-2.amazonaws.com.
  • Запустить тот же код на другом устройстве.

Некоторые заметки из комментариев:

  • SSLv3 устарела по всем услугам АМС.
  • Удалить aws-java-sdk и использовать aws-android-sdk. У последнего много оптимизаций для Android.
  • aws-android-sdk использует HttpURLConnection как стандартную HTTP-библиотеку.

Чтобы проверить, какие протоколы поддерживает сервис, используйте следующую команду:

openssl s_client -connect dynamodb.us-west-2.amazonaws.com:443 
+0

Хорошо, спасибо за информацию. Я попробую, что вы сказали, и сделайте соответствующие корректировки. – SydStorm

+0

Я пришел, чтобы узнать, как упоминалось ранее, что устройство, где произошел сбой * * поддерживает TLS v1.2. Кроме того, после запуска теста сервера: [SSLLabs] (https://www.ssllabs.com/ssltest/analyze.html?d=dynamodb.us-east-1.amazonaws.com&latest) он показывает мне, что TLS v1. 2 не поддерживается сервером, с которым я хочу установить соединение. Я полагаю, что это означает, что устройство не сможет общаться с серверами Dynamo до тех пор, пока (если) Amazon не обновит свой протокол до TLS v1.2? – SydStorm

+0

Официальный [doc] (http://developer.android.com/reference/javax/net/ssl/SSLSocket.html) говорит, что TLSv1.0 включен и поддерживается по умолчанию. Не знаете, почему ваше устройство не поддерживает его. Учитывая это, ваше устройство не может напрямую подключиться к DynamoDB, пока служба не поддерживает TLSv1.2. Альтернативой является использование [API Gateway] (https://aws.amazon.com/api-gateway/) в качестве прокси-сервера для DynamoDB. API Gateway поддерживает TLSv1.2. – Yangfan

Смежные вопросы