【问题标题】:AWS DynamoDbMapper Error... Caused by: javax.net.ssl.SSLProtocolException:AWS DynamoDbMapper 错误...原因:javax.net.ssl.SSLProtocolException:
【发布时间】:2016-01-12 06:32:52
【问题描述】:

我正在尝试从 AWS 实施 DynamoDBMapper,但是当我尝试连接到 AWS 服务器时应用程序崩溃了。

首先,我在 Android Studio 模拟器上运行 Android 4.4.2,一切似乎都运行良好。那里没有问题。尽管如此,当我尝试在实际设备上运行时(在平板电脑上运行 4.4.2...不知道制造商),我收到以下错误:

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
    @@@@.@@@@@.@@@@$@@@@.doInBackground  MainActivity.java:1259
    @@@@.@@@@@.@@@@$@@@@.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);

并在 AmazonDynamoDbClient 构造函数中为其提供 awsCredentials。但是,它接受:

org.apache.http.conn.ssl.SSLSocketFactory

不是

javax.net.ssl.SSLSocketFactory

这是我提供的链接的答案中使用的内容(更不用说 Android Studio 通知我 org.apache.http.conn.ssl.SSLSocketFactory 已弃用)。

无论如何,对于此事的任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 您使用的是什么 AWS 开发工具包?
  • 我已将这些添加到我的 gradle 文件中: compile 'com.amazonaws:aws-android-sdk-core:2.+' compile 'com.amazonaws:aws-android-sdk-cognito:2 .+' 编译'com.amazonaws:aws-android-sdk-s3:2.+' 编译'com.amazonaws:aws-android-sdk-ddb:2.+' 编译'com.amazonaws:aws-android-sdk -ddb-mapper:2.+' 所以它应该是最新的。另外,我添加了: compile files('libs/aws-java-sdk-1.10.45.jar') 到我的项目中,这样我就可以使用具有“getApacheHttpClientConfig()”方法的 ClientConfiguration。
  • 您不支持使用不适用于 Android 的 aws-java-sdk。 FYI 适用于 Android 的 AWS 开发工具包使用 HttpURLConnection 作为默认 HTTP 库。所有 AWS 服务均已弃用 SSLv3。由于某种原因,您的设备似乎无法与 TLSv1.0+ 协议进行协商。理论上应该支持TLSv1.0。我建议您在其他设备上尝试一下。
  • 事实证明,我被告知我使用的设备是行业标准的,使用的是 TLSv1.2。在 ssllabs.com 上测试服务器后,我发现 AWS 不支持此协议……这是真的吗?如果是这样,这是否意味着周围也没有锻炼?

标签: java android amazon-web-services ssl sslv3


【解决方案1】:

您可以使用org.apache.http.conn.ssl.SSLConnectionSocketFactory 代替org.apache.http.conn.ssl.SSLSocketFactory

来自 SSLSocketFactory 的 JavaDoc (https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/conn/ssl/SSLSocketFactory.html) -

已弃用。 (4.3) 使用 SSLConnectionSocketFactory

【讨论】:

    【解决方案2】:

    像 Cognito 这样的一些服务支持 TLSv1.0+,而有些人说 DynamoDB 只支持 TLSv1.0(不在上面)。如果您的设备支持 TLSv1.0,那么它应该可以工作。既然你说代码可以在模拟器上运行,但不能在平板电脑上运行,很难说问题出在哪里。我建议你试试这些:

    • 在浏览器中访问https://dynamodb.us-west-2.amazonaws.com。如果您的设备可以处理 TLSv1.0,您应该会看到 healthy: dynamodb.us-west-2.amazonaws.com
    • 在不同的设备上运行相同的代码。

    来自 cmets 的一些笔记:

    • 所有 AWS 服务都已弃用 SSLv3。
    • 删除 aws-java-sdk 并使用 aws-android-sdk。后者针对 Android 做了很多优化。
    • aws-android-sdk 使用 HttpURLConnection 作为默认 HTTP 库。

    要测试服务支持哪些协议,请使用以下命令:

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

    【讨论】:

    • 好的,谢谢你的信息。我会尝试你所说的并做出适当的调整。
    • 如前所述,我了解到发生崩溃的设备支持 TLS v1.2。此外,在SSLLabs 运行服务器测试后,它显示我要连接的服务器不支持 TLS v1.2。我认为这最终意味着设备无法与 Dynamo 服务器通信,直到(如果)亚马逊将其协议更新为 TLS v1.2?
    • 官方doc表示默认启用并支持TLSv1.0。不知道为什么您的设备不支持它。鉴于此,在服务支持 TLSv1.2 之前,您的设备无法直接连接到 DynamoDB。另一种方法是使用 API Gateway 作为 DynamoDB 的代理。 API 网关支持 TLSv1.2。
    猜你喜欢
    • 2021-12-21
    • 2017-05-22
    • 2016-02-26
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多