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发送给客户端
    • 客户端收到信息后 生成随机数(通过公钥进行加密) 编码结速通知 握手结束通知
    • 服务端 通过私钥解密 编码改变通知 握手结束通知
    • 对称加密数据传输
版权声明: 版权声明:本文为博主原创文章,如需转载请在文章中注明“转载”并在文章开头附上本博客链接。

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

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

SSL握手过程实例分析

为了更好理解SSL协议的握手过程,结合实例,使用Wireshark抓包分析SSL握手过程中客户端与服务器间的交互过程。本例中服务器为https://www.baidu.com/(180.97.33.1...

SSL交互(握手)过程详解

原文:http://www.cpplive.com/html/1387.html 普通的TCP通信无法保证数据的安全,它随时可能被第三方截获而泄漏通信双方之间的隐私,这显然是我们不希...

AFNetworking 3.0 https 报错问题 CFNetwork SSLHandshake failed (-9801)

AFNetworking 3.0在使用https请求时候报错 NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSS...

linux下svn不能连接上windows服务器:SSL handshake failed: SSL 错误:在证书中检测到违规的密钥用法

 之前已经在windows2003上用visualSVN配置好了SVN服务器,并且在windows虚拟机的客户端可以正常使用。     但是,今天在unbuntu11.10上尝试运行svn,就...
  • yihui8
  • yihui8
  • 2014年09月12日 20:30
  • 1103

SSL handshake failed: SSL 错误:在证书中检测到违规的密钥用法

Linux下svn不能连接上Windows服务器:SSL handshake failed: SSL 错误:在证书中检测到违规的密钥用法。 之前已经在Windows 2003上用visualSVN配...

Https的数据请求的证书设置 CFNetwork SSLHandshake failed (-9806)

对于https的网络请求很多人都比较头疼,不止iOS包括pc端和移动端的很多请求都离不开https CFNetwork SSLHandshake failed (-9806) erro...

https请求 CFNetwork SSLHandshake failed (-9807) A connection failure occurred: SSL problem

利用ASIHttpRequest,通过https进行网络请求,返回CFNetwork SSLHandshake failed (-9807)错误 或者报一下错误 ...

linux下svn不能连接上windows服务器:SSL handshake failed: SSL 错误:在证书中检测到违规的密钥用法

之前已经在windows2003上用visualSVN配置好了SVN服务器,并且在windows虚拟机的客户端可以正常使用。     但是,今天在unbuntu11.10上尝试运行svn,就装了一个...
  • duguteng
  • duguteng
  • 2012年07月08日 15:26
  • 15024

HTTPS协议详解(四):TLS/SSL握手过程

本文大部分内容摘自:http://www.wosign.com/faq/faq2016-0309-04.htm 尊重知识产权,转载请注明Wosign专栏导航HTTPS协议详解(一):HTTPS基础知识...
  • hherima
  • hherima
  • 2016年09月08日 12:24
  • 11280
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 6.0 HTTPS SSL 无法访问,提示Handshake failed(握手失败),解决方案
举报原因:
原因补充:

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