Android 6.0 HTTPS连接ssl3_get_server_key_exchange:BAD_DH_P_LENGTH错误问题

liuxian233 2015-10-15 04:12:52
升级到中兴AXON Android6.0系统后客户端与服务器的HTTPS连接handshake报错:
error:100c1069:SSL routines:ssl3_get_server_key_exchange:BAD_DH_P_LENGTH (external/boringssl/src/ssl/s3_clnt.c:1193 0x7f8c3e8458:0x00000000)

经查是Tomcat服务器侧的SSL/TLS配置存在安全漏洞导致Android6.0上的BoringSSL报错,PS,Android6.0上Google用自家的BoringSSL替代了OpenSSL。

SSL/TLS握手过程中,假如选中了诸如TLS_DHE_RSA_WITH_AES_128_CBC_SHA这样使用deffie-hellman密钥的cipher,那么在deffie-hellman密钥交换过程中会使用的一个P参数(prime number),服务器侧提供的P参数在JDK8之前都只用了768bit的长度,小于1024bit存在安全漏洞可导致logjam attack,会被最新本版的浏览器和BoringSSL拒绝。

Tomcat修复该问题有两个选择,一是升级JDK到8,二是在server.xml的connector配置里显示声明使用哪些cipher来排除用到deffie-hellman密钥的,例如:
<Connector port="443" SSLEnabled="true" sslProtocol="TLS"
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"
…… />

想深入了解到童鞋可参考
https://weakdh.org/
https://wiki.mozilla.org/Security/Server_Side_TLS
https://github.com/jvehent/cipherscan

...全文
1430 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
No_what_cant 2016-04-08
  • 打赏
  • 举报
回复
配置客户端加密套件也是可以的 例如 okhttp

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发送给客户端 * 客户端收到信息后 生成随机数(通过公钥进行加密) 编码结速通知 握手结束通知 * 服务端 通过私钥解密 编码改变通知 握手结束通知 * 对称加密数据传输
沙僧 2016-03-17
  • 打赏
  • 举报
回复
赞!!!!!! 就是第一眼没有看懂到底在说什么,后来我自己又总结了一下, 不过还是解决了 感谢
aa51513 2016-03-17
  • 打赏
  • 举报
回复
我也遇到了这个问题,非常感谢大神指点,再次致敬
水上木_1 2015-12-30
  • 打赏
  • 举报
回复
支持一下,正好解决我的问题

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧