Android 6.0 HTTPS SSL 无法访问,提示Handshake failed(握手失败),解决方案

原创 2016年08月31日 09:07:59

前言

之前开发的一个项目使用的是http请求,但是安全公司给出了一个安全报告,建议使用https协议来访问网络资源,使用私签证书来实现了https。Android 6.0以下的版本均可以使用,Android 6.0及以上的机型请求成功,并且在logcat中有Handshake failed的Exception。

分析

Android 6.0以下可以访问,6.0及以上不可以,初步判断是因为Android版本更新造成的,
经过一番google之,根据本地报错含有BAD_DH_P_LENGTH关键字。
确定问题出现在Java ssl 加密漏洞上。

在握手过程中,必定会涉及到公钥加密,私钥解密的过程,而该过程中,当服务端选择使用诸如TLS_DHE_RSA_WITH_AES_128_CBC_SHA等算法进行加密时,需要使用到Diffie-Hellman算法进行加密解密,通过阅读Diffie-Hellman算法的介绍,发现在加密解密计算过程中,会使用到两个参数,一个是q,一个是a,而在JDK8之前,服务器端提供的q参数只是用了768bit的长度,而不足1024bit则存在相应的安全漏洞,会被替换后的BroingSSL拒绝,因此出现了Handshake failed错误。

文/一只猿_(简书作者)
原文链接:http://www.jianshu.com/p/40c17846e626
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

解决方案

方案一、修改tomcat

配置Tomcat服务器,限制加密方式:
修改Tomcat服务器conf/server.xml文件中和Https有关的Connector节点,添加ciphers用于指定密钥:
SSLEnabled=”true”
clientAuth=”false”
connectionTimeout=”20000”
keystoreFile=”/usr/xinwei/tienlen/apache-tomcat-https/server.keystore”
keystorePass=”xinwei”
maxThreads=”150”
port=”443”
protocol=”org.apache.coyote.http11.Http11Protocol”
redirectPort=”8443”
scheme=”https”
secure=”true”
ciphers=”TLS_RSA_WITH_AES_128_CBC_SHA256,
TLS_RSA_WITH_AES_128_CBC_SHA,
TLS_RSA_WITH_AES_256_CBC_SHA256,
TLS_RSA_WITH_AES_256_CBC_SHA,
SSL_RSA_WITH_3DES_EDE_CBC_SHA”
sslProtocol=”TLS”
truststoreFile=”/usr/xinwei/tienlen/apache-tomcat-https/server.keystore”
truststorePass=”密码”
/>

添加完该配置后,重启,测试,Android6.0版本没有再发现Handshake failed错误。

文/一只猿_(简书作者)
原文链接:http://www.jianshu.com/p/40c17846e626
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

很遗憾,我们服务器使用的是JDK 1.6、tomcat 7 ,配置ciphers,启动服务后会报错,报错原因是不识别加密方式、所以我们没有采用这个方式,应该是因为TSL协议的版本问题

方案二、升级JDK至1.8版本

我们采用这个方式,成功修复了SSL Handshake failed的问题,只要代码中没有使用Java8 不再兼容的特性,一般没有问题。

方案三、使用OKhttp时客户端修改SSL配置客户端加密套件(未验证,收录)

OkHttpClient okHttpClient = new OkHttpClient.Builder()
                    .connectTimeout(15, TimeUnit.SECONDS)
                    .readTimeout(15, TimeUnit.SECONDS)
                    .writeTimeout(15, TimeUnit.SECONDS)
                    .addNetworkInterceptor(new StethoInterceptor())
                    .followSslRedirects(true)
                    .connectionSpecs(Collections.singletonList(getConnectionSpec()))
                    .build();

    private static ConnectionSpec getConnectionSpec() {
        ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS).tlsVersions(TlsVersion.TLS_1_0).cipherSuites(CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA256, CipherSuite.TLS_RSA_WITH_AES_128_CBC_SHA, CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA256, CipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA, CipherSuite.TLS_RSA_WITH_3DES_EDE_CBC_SHA).build();
        return spec;
    }
  • https三次握手:
    • 客户端发送 TLS版本号 加密套件(这里) 随机数 hello
    • 服务端根据客户端发送的加密套件、TLS版本号 选择对应的加密协议及套件 把加密协议、加密套件、随机数、服务端证书、hello发送给客户端
    • 客户端收到信息后 生成随机数(通过公钥进行加密) 编码结速通知 握手结束通知
    • 服务端 通过私钥解密 编码改变通知 握手结束通知
    • 对称加密数据传输
版权声明: 版权声明:本文为博主原创文章,如需转载请在文章中注明“转载”并在文章开头附上本博客链接。

相关文章推荐

android5.0无法使用HttpClient解决办法

由于官方不再推荐使用HttpClient而是推荐使用HttpUrlConnection 原因可以看下 http://www.androidchina.net/394.html 如果需要使用Http...

Android6.0使用Https出现Handshake failed错误

Android6.0版本开发中使用Https进行网络请求,出现Handshake failed错误原因及解决办法

<Jupyter Notebook>无法访问/404页面/SSL ERROR (总之就是连接不上)——问题与解决方案

前置条件:(本例中为Cent OS7)安装好 jupyter notebook;例如安装在 /home/me 目录下、端口设置为8888 操作目录:jupyter_notebook_config.py...
  • JJwho
  • JJwho
  • 2017-07-14 10:35
  • 560

Android SDK 更新失败解决 Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xml

问题描述 使用SDK Manager更新时出现问题 Failed to fetch URL https://dl-ssl.google.com/android/repository/rep...

使用https出错javax.net.ssl.SSLHandshakeException: Handshake failed

最近项目中要用到https,android这边使用的是httpsurlconnection来进行访问的。其中遇到了一个非常诡异的问题,在此记录下来,以供参考: 注:https 的证书是后台自己生成的,...

关于服务器ssl配置以后,https无法访问的问题

通常在项目里,如果要用到ssl的话,一般都是自己先做个免费的证书在开发的过程中用的。等到上线了才去花钱买ssl证书。 这一回,自制了证书,在apache里也配置好后,始终无法通过https访...

com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: Handshake failed

上班上的好好的,一个其他部门的同事来着手机来说,APP在他的手机上登录不进去。 实在是最近没有进行升级,在其他手机上也是好好的呀 ~~~ 然后他说他以前也是好的,最近手机升级了一次。一查看版本,A...
  • shxixi
  • shxixi
  • 2016-04-06 11:17
  • 3514
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)