android 服务端返回 n不好用,ssl-SSLHandshakeException:Android N / 7.0上的握手失败

我正在开发一个应用程序,(高级)用户必须为此设置自己的服务器(即nginx)才能运行后端应用程序。 需要在应用程序中配置相应的域,以便它可以连接。 我主要在自己的手机(sony z3c)上进行测试,并开始为5.1开发。 后来我收到了6.0的更新,但在仿真器中仍保持有效的5.1。 不久前,我开始使用具有7.0映像的AVD进行工作,但令我惊讶的是它无法连接到服务器,并告诉我SSL握手失败。 我的nginx配置非常严格,但它同时适用于5.1和6.0,所以....?!

这是我所知道的:

我将v24用于支持库,即我的compileSdkVersion为24。

我使用Volley v1.0.0。

我已经尝试了TLSSocketFactory,但是它没有任何改变。 无论如何,似乎大多数时候都使用此方法来防止将SSL3用于较早的SDK版本。

我尝试增加超时时间,但是它没有任何改变。

我已经尝试过直接使用HttpURLConnection,但是除了堆栈跟踪外,它没有任何改变(它没有凌空引用,但是完全相同)。

如果没有TLSSocketFactory,则请求将通过裸请求队列发出,并使用secp384r1 (0x0018)实例化。

这是我在android studio中看到的:

W/System.err: com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: Connection closed by peer

W/System.err: at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:151)

W/System.err: at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:112)

W/System.err: Caused by: javax.net.ssl.SSLHandshakeException: Connection closed by peer

W/System.err: at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)

W/System.err: at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:357)

W/System.err: at com.android.okhttp.Connection.connectTls(Connection.java:235)

W/System.err: at com.android.okhttp.Connection.connectSocket(Connection.java:199)

W/System.err: at com.android.okhttp.Connection.connect(Connection.java:172)

W/System.err: at com.android.okhttp.Connection.connectAndSetOwner(Connection.java:367)

W/System.err: at com.android.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:130)

W/System.err: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:329)

W/System.err: at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:246)

W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)

W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:126)

W/System.err: at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:257)

W/System.err: at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)

W/System.err: at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java)

W/System.err: at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:264)

W/System.err: at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:234)

W/System.err: at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:107)

W/System.err: at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:96)

W/System.err: ... 1 more

W/System.err: Suppressed: javax.net.ssl.SSLHandshakeException: Handshake failed

W/System.err: at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:429)

W/System.err: ... 17 more

W/System.err: Caused by: javax.net.ssl.SSLProtocolException: SSL handshake terminated: ssl=0x7ffef3748040: Failure in SSL library, usually a protocol error

W/System.err: error:10000410:SSL routines:OPENSSL_internal:SSLV3_ALERT_HANDSHAKE_FAILURE (external/boringssl/src/ssl/s3_pkt.c:610 0x7ffeda1d2240:0x00000001)

W/System.err: error:1000009a:SSL routines:OPENSSL_internal:HANDSHAKE_FAILURE_ON_CLIENT_HELLO (external/boringssl/src/ssl/s3_clnt.c:764 0x7ffee9d2b70a:0x00000000)

W/System.err: at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)

W/System.err: at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:357)

W/System.err: ... 17 more

由于它说secp384r1 (0x0018),我只能假定由于某种原因尝试使用SSLv3进行连接而失败,但这对我来说毫无意义。 它可能是一个密码问题,但是我怎么知道它试图使用什么呢? 我宁愿不启用服务器上的密码,进行连接尝试并重复。

我的nginx站点使用一个“让我们加密”证书,并具有以下配置:

ssl_stapling on;

ssl_stapling_verify on;

ssl_trusted_certificate /etc/ssl/certs/lets-encrypt-x1-cross-signed.pem;

ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:!aNULL;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

ssl_ecdh_curve secp384r1;

ssl_prefer_server_ciphers on;

ssl_protocols TLSv1.2;

为了测试这些密码,我有一个脚本,它可以确认这些密码(在服务器网络外部的微调vps上运行):

Testing ECDHE-RSA-AES256-GCM-SHA384...YES

Testing ECDHE-ECDSA-AES256-GCM-SHA384...NO (sslv3 alert handshake failure)

Testing ECDHE-RSA-AES256-SHA384...NO (sslv3 alert handshake failure)

Testing ECDHE-ECDSA-AES256-SHA384...NO (sslv3 alert handshake failure)

Testing ECDHE-RSA-AES256-SHA...NO (sslv3 alert handshake failure)

Testing ECDHE-ECDSA-AES256-SHA...NO (sslv3 alert handshake failure)

Testing SRP-DSS-AES-256-CBC-SHA...NO (sslv3 alert handshake failure)

Testing SRP-RSA-AES-256-CBC-SHA...NO (sslv3 alert handshake failure)

Testing DHE-DSS-AES256-GCM-SHA384...NO (sslv3 alert handshake failure)

Testing DHE-RSA-AES256-GCM-SHA384...NO (sslv3 alert handshake failure)

Testing DHE-RSA-AES256-SHA256...NO (sslv3 alert handshake failure)

Testing DHE-DSS-AES256-SHA256...NO (sslv3 alert handshake failure)

Testing DHE-RSA-AES256-SHA...NO (sslv3 alert handshake failure)

Testing DHE-DSS-AES256-SHA...NO (sslv3 alert handshake failure)

Testing DHE-RSA-CAMELLIA256-SHA...NO (sslv3 alert handshake failure)

Testing DHE-DSS-CAMELLIA256-SHA...NO (sslv3 alert handshake failure)

Testing AECDH-AES256-SHA...NO (sslv3 alert handshake failure)

Testing SRP-AES-256-CBC-SHA...NO (sslv3 alert handshake failure)

Testing ADH-AES256-GCM-SHA384...NO (sslv3 alert handshake failure)

Testing ADH-AES256-SHA256...NO (sslv3 alert handshake failure)

Testing ADH-AES256-SHA...NO (sslv3 alert handshake failure)

Testing ADH-CAMELLIA256-SHA...NO (sslv3 alert handshake failure)

Testing ECDH-RSA-AES256-GCM-SHA384...NO (sslv3 alert handshake failure)

Testing ECDH-ECDSA-AES256-GCM-SHA384...NO (sslv3 alert handshake failure)

Testing ECDH-RSA-AES256-SHA384...NO (sslv3 alert handshake failure)

Testing ECDH-ECDSA-AES256-SHA384...NO (sslv3 alert handshake failure)

Testing ECDH-RSA-AES256-SHA...NO (sslv3 alert handshake failure)

Testing ECDH-ECDSA-AES256-SHA...NO (sslv3 alert handshake failure)

Testing AES256-GCM-SHA384...NO (sslv3 alert handshake failure)

Testing AES256-SHA256...NO (sslv3 alert handshake failure)

Testing AES256-SHA...NO (sslv3 alert handshake failure)

Testing CAMELLIA256-SHA...NO (sslv3 alert handshake failure)

Testing PSK-AES256-CBC-SHA...NO (no ciphers available)

Testing ECDHE-RSA-DES-CBC3-SHA...NO (sslv3 alert handshake failure)

Testing ECDHE-ECDSA-DES-CBC3-SHA...NO (sslv3 alert handshake failure)

Testing SRP-DSS-3DES-EDE-CBC-SHA...NO (sslv3 alert handshake failure)

Testing SRP-RSA-3DES-EDE-CBC-SHA...NO (sslv3 alert handshake failure)

Testing EDH-RSA-DES-CBC3-SHA...NO (sslv3 alert handshake failure)

Testing EDH-DSS-DES-CBC3-SHA...NO (sslv3 alert handshake failure)

Testing AECDH-DES-CBC3-SHA...NO (sslv3 alert handshake failure)

Testing SRP-3DES-EDE-CBC-SHA...NO (sslv3 alert handshake failure)

Testing ADH-DES-CBC3-SHA...NO (sslv3 alert handshake failure)

Testing ECDH-RSA-DES-CBC3-SHA...NO (sslv3 alert handshake failure)

Testing ECDH-ECDSA-DES-CBC3-SHA...NO (sslv3 alert handshake failure)

Testing DES-CBC3-SHA...NO (sslv3 alert handshake failure)

Testing PSK-3DES-EDE-CBC-SHA...NO (no ciphers available)

Testing ECDHE-RSA-AES128-GCM-SHA256...YES

Testing ECDHE-ECDSA-AES128-GCM-SHA256...NO (sslv3 alert handshake failure)

Testing ECDHE-RSA-AES128-SHA256...NO (sslv3 alert handshake failure)

Testing ECDHE-ECDSA-AES128-SHA256...NO (sslv3 alert handshake failure)

Testing ECDHE-RSA-AES128-SHA...NO (sslv3 alert handshake failure)

Testing ECDHE-ECDSA-AES128-SHA...NO (sslv3 alert handshake failure)

Testing SRP-DSS-AES-128-CBC-SHA...NO (sslv3 alert handshake failure)

Testing SRP-RSA-AES-128-CBC-SHA...NO (sslv3 alert handshake failure)

Testing DHE-DSS-AES128-GCM-SHA256...NO (sslv3 alert handshake failure)

Testing DHE-RSA-AES128-GCM-SHA256...NO (sslv3 alert handshake failure)

Testing DHE-RSA-AES128-SHA256...NO (sslv3 alert handshake failure)

Testing DHE-DSS-AES128-SHA256...NO (sslv3 alert handshake failure)

Testing DHE-RSA-AES128-SHA...NO (sslv3 alert handshake failure)

Testing DHE-DSS-AES128-SHA...NO (sslv3 alert handshake failure)

Testing DHE-RSA-SEED-SHA...NO (sslv3 alert handshake failure)

Testing DHE-DSS-SEED-SHA...NO (sslv3 alert handshake failure)

Testing DHE-RSA-CAMELLIA128-SHA...NO (sslv3 alert handshake failure)

Testing DHE-DSS-CAMELLIA128-SHA...NO (sslv3 alert handshake failure)

Testing AECDH-AES128-SHA...NO (sslv3 alert handshake failure)

Testing SRP-AES-128-CBC-SHA...NO (sslv3 alert handshake failure)

Testing ADH-AES128-GCM-SHA256...NO (sslv3 alert handshake failure)

Testing ADH-AES128-SHA256...NO (sslv3 alert handshake failure)

Testing ADH-AES128-SHA...NO (sslv3 alert handshake failure)

Testing ADH-SEED-SHA...NO (sslv3 alert handshake failure)

Testing ADH-CAMELLIA128-SHA...NO (sslv3 alert handshake failure)

Testing ECDH-RSA-AES128-GCM-SHA256...NO (sslv3 alert handshake failure)

Testing ECDH-ECDSA-AES128-GCM-SHA256...NO (sslv3 alert handshake failure)

Testing ECDH-RSA-AES128-SHA256...NO (sslv3 alert handshake failure)

Testing ECDH-ECDSA-AES128-SHA256...NO (sslv3 alert handshake failure)

Testing ECDH-RSA-AES128-SHA...NO (sslv3 alert handshake failure)

Testing ECDH-ECDSA-AES128-SHA...NO (sslv3 alert handshake failure)

Testing AES128-GCM-SHA256...NO (sslv3 alert handshake failure)

Testing AES128-SHA256...NO (sslv3 alert handshake failure)

Testing AES128-SHA...NO (sslv3 alert handshake failure)

Testing SEED-SHA...NO (sslv3 alert handshake failure)

Testing CAMELLIA128-SHA...NO (sslv3 alert handshake failure)

Testing PSK-AES128-CBC-SHA...NO (no ciphers available)

Testing ECDHE-RSA-RC4-SHA...NO (sslv3 alert handshake failure)

Testing ECDHE-ECDSA-RC4-SHA...NO (sslv3 alert handshake failure)

Testing AECDH-RC4-SHA...NO (sslv3 alert handshake failure)

Testing ADH-RC4-MD5...NO (sslv3 alert handshake failure)

Testing ECDH-RSA-RC4-SHA...NO (sslv3 alert handshake failure)

Testing ECDH-ECDSA-RC4-SHA...NO (sslv3 alert handshake failure)

Testing RC4-SHA...NO (sslv3 alert handshake failure)

Testing RC4-MD5...NO (sslv3 alert handshake failure)

Testing PSK-RC4-SHA...NO (no ciphers available)

Testing EDH-RSA-DES-CBC-SHA...NO (sslv3 alert handshake failure)

Testing EDH-DSS-DES-CBC-SHA...NO (sslv3 alert handshake failure)

Testing ADH-DES-CBC-SHA...NO (sslv3 alert handshake failure)

Testing DES-CBC-SHA...NO (sslv3 alert handshake failure)

Testing EXP-EDH-RSA-DES-CBC-SHA...NO (sslv3 alert handshake failure)

Testing EXP-EDH-DSS-DES-CBC-SHA...NO (sslv3 alert handshake failure)

Testing EXP-ADH-DES-CBC-SHA...NO (sslv3 alert handshake failure)

Testing EXP-DES-CBC-SHA...NO (sslv3 alert handshake failure)

Testing EXP-RC2-CBC-MD5...NO (sslv3 alert handshake failure)

Testing EXP-ADH-RC4-MD5...NO (sslv3 alert handshake failure)

Testing EXP-RC4-MD5...NO (sslv3 alert handshake failure)

Testing ECDHE-RSA-NULL-SHA...NO (sslv3 alert handshake failure)

Testing ECDHE-ECDSA-NULL-SHA...NO (sslv3 alert handshake failure)

Testing AECDH-NULL-SHA...NO (sslv3 alert handshake failure)

Testing ECDH-RSA-NULL-SHA...NO (sslv3 alert handshake failure)

Testing ECDH-ECDSA-NULL-SHA...NO (sslv3 alert handshake failure)

Testing NULL-SHA256...NO (sslv3 alert handshake failure)

Testing NULL-SHA...NO (sslv3 alert handshake failure)

Testing NULL-MD5...NO (sslv3 alert handshake failure

我可以在模拟器的浏览器中打开服务器URL,并获得完美的json响应,因此我知道系统本身具有功能。

所以问题是,为什么我不能在Android 7上连接?

更新:

我已经使用tcpdump和wirehark查看了捕获的数据包,并且启用的密码位于ClientHello中,因此这应该不是问题。

Cipher Suites (18 suites)

Cipher Suite: Unknown (0xcca9)

Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b)

Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (0xc02c)

Cipher Suite: Unknown (0xcca8)

Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)

Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)

Cipher Suite: TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (0x009e)

Cipher Suite: TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (0x009f)

Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009)

Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)

Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)

Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)

Cipher Suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA (0x0033)

Cipher Suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA (0x0039)

Cipher Suite: TLS_RSA_WITH_AES_128_GCM_SHA256 (0x009c)

Cipher Suite: TLS_RSA_WITH_AES_256_GCM_SHA384 (0x009d)

Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002f)

Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)

如您所见secp384r1 (0x0018)和0xc030匹配,但是下一个TLSv1.2数据包显示:Alert (21), Handshake Failure (40)。

更新2:

这些是ClientHello中Android 5.1的曲线:

Elliptic curves (25 curves)

Elliptic curve: sect571r1 (0x000e)

Elliptic curve: sect571k1 (0x000d)

Elliptic curve: secp521r1 (0x0019)

Elliptic curve: sect409k1 (0x000b)

Elliptic curve: sect409r1 (0x000c)

Elliptic curve: secp384r1 (0x0018)

Elliptic curve: sect283k1 (0x0009)

Elliptic curve: sect283r1 (0x000a)

Elliptic curve: secp256k1 (0x0016)

Elliptic curve: secp256r1 (0x0017)

Elliptic curve: sect239k1 (0x0008)

Elliptic curve: sect233k1 (0x0006)

Elliptic curve: sect233r1 (0x0007)

Elliptic curve: secp224k1 (0x0014)

Elliptic curve: secp224r1 (0x0015)

Elliptic curve: sect193r1 (0x0004)

Elliptic curve: sect193r2 (0x0005)

Elliptic curve: secp192k1 (0x0012)

Elliptic curve: secp192r1 (0x0013)

Elliptic curve: sect163k1 (0x0001)

Elliptic curve: sect163r1 (0x0002)

Elliptic curve: sect163r2 (0x0003)

Elliptic curve: secp160k1 (0x000f)

Elliptic curve: secp160r1 (0x0010)

Elliptic curve: secp160r2 (0x0011)

在ServerHello中返回secp384r1 (0x0018)。

这是来自Android 7:

Elliptic curves (1 curve)

Elliptic curve: secp256r1 (0x0017)

导致握手失败。

通过删除secp384r1或将其替换为默认值(prime256v1)来更改nginx配置,可以使其正常工作。 所以我想问题仍然存在:我可以添加椭圆曲线吗?

使用模拟器时,与使用Android 7.0设备(通用移动4G)时捕获的数据相同。

更新3:

小更新,但值得一提:我使用Android 7.1.1(!)在仿真器中运行它。 它显示以下数据(同样,使用tcpdump抓取并使用wirehark查看):

Elliptic curves (3 curves)

Elliptic curve: secp256r1 (0x0017)

Elliptic curve: secp384r1 (0x0018)

Elliptic curve: secp512r1 (0x0019)

它显示了相同的18个密码套件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值