AWS DynamoDbMapper错误。。。原因:javax.net.ssl.SSLProtocolException:

AWS DynamoDbMapper错误。。。原因:javax.net.ssl.SSLProtocolException:,java,android,amazon-web-services,ssl,sslv3,Java,Android,Amazon Web Services,Ssl,Sslv3,我试图从AWS实现DynamoDBMapper,但当我尝试连接到AWS服务器时,应用程序崩溃 首先,我在安卓工作室模拟器上运行安卓4.4.2,一切似乎都很好。没问题。尽管如此,当我尝试在实际设备上运行(在平板电脑上运行4.4.2…不知道制造商)时,我得到以下错误: Caused by: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x6bffcdf0: Failure in SSL library, u

我试图从AWS实现DynamoDBMapper,但当我尝试连接到AWS服务器时,应用程序崩溃

首先,我在安卓工作室模拟器上运行安卓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)。这是另一个问题,似乎有人解决了一个与此非常相似的问题:

因此,如果这是导致问题的原因(需要删除SSLv3),我如何配置AmazondynamodClient以仅使用TLS 1.0?我注意到您可以创建ClientConfiguration并使用:

clientConfiguration.getApacheHttpClientConfig().setSslSocketFactory(NoSSLv3SocketFactory);
并在AmazondynamodClient构造函数中为其提供awsCredentials。但是,它接受:

org.apache.http.conn.ssl.SSLSocketFactory
不是

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


无论如何,在这件事上给予任何帮助都将不胜感激。谢谢

您可以使用
org.apache.http.conn.ssl.SSLConnectionSocketFactory
而不是
org.apache.http.conn.ssl.SSLSocketFactory

来自SSLSocketFactory()的JavaDoc-

不赞成。 (4.3)使用SSL连接插座工厂


您可以使用
org.apache.http.conn.ssl.SSLConnectionSocketFactory
而不是
org.apache.http.conn.ssl.SSLSocketFactory

来自SSLSocketFactory()的JavaDoc-

不赞成。 (4.3)使用SSL连接插座工厂


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

  • 在浏览器中访问。如果您的设备能够处理TLSv1.0,您应该看到
    健康:dynamodb.us-west-2.amazonaws.com
  • 在不同的设备上运行相同的代码
评论中的一些注释:

  • 所有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

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

  • 在浏览器中访问。如果您的设备能够处理TLSv1.0,您应该看到
    健康:dynamodb.us-west-2.amazonaws.com
  • 在不同的设备上运行相同的代码
评论中的一些注释:

  • 所有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

你使用的是什么AWS SDK?我已经将这些添加到我的gradle文件中:compile'com.amazonaws:AWS android SDK核心:2.+'compile'com.amazonaws:AWS android SDK cognito:2.+'compile'com.amazonaws:AWS android SDK ddb:2.+'compile'com.amazonaws:AWS android SDK ddb映射器:2.+'最近的另外,我在我的项目中添加了:compile files('libs/aws-java-sdk-1.10.45.jar'),这样我就可以使用具有“getApacheHttpClientConfig()”方法的ClientConfiguration。您不支持使用不适用于Android的aws java sdk。仅供参考,Android版AWS SDK使用HttpURLConnection作为默认HTTP库。所有AWS服务上都不推荐使用SSLv3。由于某种原因,您的设备似乎无法与TLSv1.0+协议协商。理论上应该支持TLSv1.0。我建议您在另一台设备上试用。事实证明,我被告知我正在使用的设备是行业标准的,使用TLSv1.2。在ssllabs.com上测试服务器后,我发现AWS不支持此协议。。。这是真的吗?如果是这样,这是否意味着也没有锻炼?你在使用什么AWS SDK?我已经将这些添加到我的gradle文件中:compile'com.amazonaws:AWS android SDK核心:2.+'compile'com.amazonaws:AWS android SDK 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.+'所以它应该是最新的。另外,我在我的项目中添加了:compile files('libs/aws-java-sdk-1.10.45.jar'),这样我就可以使用具有“getApacheHttpClientConfig()”方法的ClientConfiguration。您不支持使用不适用于Android的aws java sdk。仅供参考,Android版AWS SDK使用HttpURLConnection作为默认HTTP库。所有AWS服务上都不推荐使用SSLv3。由于某种原因,您的设备似乎无法与TLSv1.0+协议协商。理论上应该支持TLSv1.0。我建议您在另一台设备上试用。事实证明,我被告知我正在使用的设备是行业标准的,使用TLSv1.2。在ssllabs.com上测试服务器后,我发现不支持此协议