javax.net.ssl.SSLProtocolException: SSL handshake aborted

问题出现

前几天在接入新版api的时候,在Android 4.4版本的机型上测试的时候,网络请求捕获了一个异常,SSLProtocolException,具体的异常信息是

com.base.http.exception.NetworkRespException: javax.net.ssl.SSLProtocolException: 
SSL handshake aborted: ssl=0x701cc980: Failure in SSL library, usually a protocol error
error:1407743E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert inappropriate fallback  
(external/openssl/ssl/s23_clnt.c:744 0x5d873dbc:0x00000000)

查找原因

这个问题到目前还是第一次遇到过,从异常信息可以看到是ssl library中进行http握手时候的错误,发出的握手信息没有得到正确fallback。
由于我们使用的是okhttp框架,所以我就去github repo上查找了issue,果然已经有很多人提了出来,发现这其实是一个Android 系统库的实现问题,对于不同的Android版本,集成的ssl版本也不同。

ProtocolSupported (API Levels)Enabled by default (API Levels)
SSLv31–TBD1–22
TLSv11+1+
TLSv1.120+20+
TLSv1.220+20+

可以发现在19及以下的Android版本中,使用的TLS v1的版本,所以对于Android 4.4及以下的机型,要建立https连接,会自动fall back到TLS v1和SSL v3,如果你的https的服务器是1.0以上,就会报出这个异常,我们现在的https的算法是AES256,而TLS v1则是AES128。

解决方案

我们需要让4.4及以下的机型支持 TLS 1.1和TLS 1.2,有人提出了一个方案:

public static OkHttpClient.Builder enableTls12OnPreLollipop(OkHttpClient.Builder client) {
    if (Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 22) {
        try {
            SSLContext sc = SSLContext.getInstance("TLSv1.2");
            sc.init(null, null, null);
            client.sslSocketFactory(new SocketFactory(sc.getSocketFactory()));

            ConnectionSpec cs = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
                    .tlsVersions(TlsVersion.TLS_1_2)
                    .build();

            List<ConnectionSpec> specs = new ArrayList<>();
            specs.add(cs);
            specs.add(ConnectionSpec.COMPATIBLE_TLS);
            specs.add(ConnectionSpec.CLEARTEXT);

            client.connectionSpecs(specs);
        } catch (Exception exc) {
            Log.e("OkHttpTLSCompat", "Error while setting TLS 1.2", exc);
        }
    }

    return client;
}

对于okhhtp来说,在创建sslscoketFactory的时候,判断是4.0-5.1的机型,我就手动支持tls 1.2,但我尝试下来,有些机型依然不行,可以供大家作参考。

我的方式是让后端在https服务器上加了一个弱算法的证书来做兼容。
https的升级是大势所趋,会变得更加安全,一些老旧机型没有与之符合的算法,安全和兼容总是很难权衡,我们会逐步提高support level,来满足安全性的需要。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenSSL SSL_read: Connection was aborted, errno 10053这个错误通常是由于网络连接中断导致的。 这可能是由于网络太慢,无法完成SSL读取操作而导致连接中止。 如果您遇到这个错误,您可以尝试换一个网络连接再次尝试。如果网络仍然非常慢,您可以尝试手动下载所需的文件,而不是依赖网络下载。 另外,如果您在使用Git时遇到了类似的错误,如fatal: unable to access ‘https://github.com/xxx/xxx/’:OpenSSL SSL_read: Connection was aborted, errno 10053,可能原因是Git默认限制了推送的大小。您可以通过运行以下命令更改限制的大小来解决这个问题:git config --global http.postBuffer 524288000。 这将增加Git推送的缓冲区大小,以便处理较大的文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [OpenSSL ssL_read: Connection was aborted,errno 10053 报错](https://blog.csdn.net/dccose/article/details/121012926)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [安装vagrant报错OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 54](https://download.csdn.net/download/weixin_38627213/14043306)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [OpenSSL SSL_read: Connection was aborted, , errno 10053](https://blog.csdn.net/bigcat030/article/details/115742972)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值