android兼容tls版本,低版本Android上TLS版本导致的诡异握手失败问题

接入某国外支付平台CashFree时,发现在低版本系统(小米红米1S青春版,Android4.3)上完全无法打开页面:

e43a84bf12c14e9cc8db8ee452bb70c6.png

低版本Android上TLS协议问题导致的SSL握手失败1

详情提示SSL握手失败:

afd3c896168401af532abc2026135450.png

低版本Android上TLS协议问题导致的SSL握手失败2

在Logcat中可以看到大量报错:

95e715c55234ac230d30a6fadc480024.png

低版本Android上TLS协议问题导致的SSL握手失败3

这些错误有几种:

E/chromium_net: external/chromium/net/socket/ssl_client_socket_openssl.cc:792: [0404/225443:ERROR:ssl_client_socket_openssl.cc(792)] handshake failed; returned -1, SSL error code 1, net_error -113

W/chromium_net: external/chromium/net/http/http_stream_factory_impl_job.cc:865: [0404/225443:WARNING:http_stream_factory_impl_job.cc(865)] Falling back to SSLv3 because host is TLS intolerant: browser.sentry-cdn.com:443

E/chromium_net: external/chromium/net/socket/ssl_client_socket_openssl.cc:792: [0404/225443:ERROR:ssl_client_socket_openssl.cc(792)] handshake failed; returned -1, SSL error code 1, net_error -107

E/chromium_net: external/chromium/net/socket/ssl_client_socket_openssl.cc:792: [0404/225446:ERROR:ssl_client_socket_openssl.cc(792)] handshake failed; returned 0, SSL error code 5, net_error -107

W/chromium_net: external/chromium/net/http/http_stream_factory_impl_job.cc:865: [0404/225446:WARNING:http_stream_factory_impl_job.cc(865)] Falling back to SSLv3 because host is TLS intolerant: www.cashfree.com:443

E/chromium_net: external/chromium/net/socket/ssl_client_socket_openssl.cc:792: [0404/225446:ERROR:ssl_client_socket_openssl.cc(792)] handshake failed; returned 0, SSL error code 5, net_error -107

1

2

3

4

5

6

E/chromium_net:external/chromium/net/socket/ssl_client_socket_openssl.cc:792:[0404/225443:ERROR:ssl_client_socket_openssl.cc(792)]handshakefailed;returned-1,SSLerrorcode1,net_error-113

W/chromium_net:external/chromium/net/http/http_stream_factory_impl_job.cc:865:[0404/225443:WARNING:http_stream_factory_impl_job.cc(865)]FallingbacktoSSLv3becausehostisTLSintolerant:browser.sentry-cdn.com:443

E/chromium_net:external/chromium/net/socket/ssl_client_socket_openssl.cc:792:[0404/225443:ERROR:ssl_client_socket_openssl.cc(792)]handshakefailed;returned-1,SSLerrorcode1,net_error-107

E/chromium_net:external/chromium/net/socket/ssl_client_socket_openssl.cc:792:[0404/225446:ERROR:ssl_client_socket_openssl.cc(792)]handshakefailed;returned0,SSLerrorcode5,net_error-107

W/chromium_net:external/chromium/net/http/http_stream_factory_impl_job.cc:865:[0404/225446:WARNING:http_stream_factory_impl_job.cc(865)]FallingbacktoSSLv3becausehostisTLSintolerant:www.cashfree.com:443

E/chromium_net:external/chromium/net/socket/ssl_client_socket_openssl.cc:792:[0404/225446:ERROR:ssl_client_socket_openssl.cc(792)]handshakefailed;returned0,SSLerrorcode5,net_error-107

经过基本的搜索后初步判断问题为服务器端仅支持Android不支持的特定SSL/TLS版本导致。我们使用https://www.ssllabs.com/ssltest来测试www.cashfree.com对SSL/TLS的支持情况:

217c97e9490a493c1712048e0a67fa82.png

测试服务器对SSL/TLS的支持情况

可见,服务器只支持TLS 1.2,因此无论是否降级为SSLv3与否都是无法进行握手的。Android在4.4.2之后才开始支持TLS 1.2:

ef8a2ae20b23939611e141936b92ff58.png

User Agent SSL/TLS Capabilities

因此设置证书信任并不能解决这个问题(实际上都还没有走到证书信任的代码就已经失败了)。Android 4.3只支持TLS1.0和SSLv3:

而对于已经不安全的SSLv3而言,在参考文档3中提到:

It is(SSL 3.0) enabled by default for:

Android 1.0, 1.1, 1.5, 1.6, 2.0–2.1, 2.2–2.2.3

And:

Android 2.3–2.3.7, 3.0–3.2.6, 4.0–4.0.4

And:

Android 5.0-5.0.2

But, seems like, it is not enabled for:

Android 5.1-5.1.1

Android 6.0-6.0.1

参考文档:1、https://www.ssllabs.com/ssltest/index.html

2、https://www.ssllabs.com/ssltest/clients.html,《User Agent Capabilities》,其中包含了各浏览器支持的TLS/SSL版本

3、https://stackoverflow.com/questions/35018510/android-4-3-webview-https-error-falling-back-to-sslv3-because-host-is-tls-int

4、https://stackoverflow.com/questions/28329652/enabling-specific-ssl-protocols-with-android-webviewclient,其中提到了利用OkHttpClient来处理ChromeWebClient的请求

5、https://blog.dev-area.net/2015/08/13/android-4-1-enable-tls-1-1-and-tls-1-2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值