最近碰到的一些 SSL 问题记录

标签: SSL Java Android APNS blog | 发表时间:2016-02-16 08:00 | 作者:
出处:http://mindwind.me/

最近碰到一些 SSL 的小问题,特记录下。

我们有个 Java 实现的 SSL TCP 服务端,为客户端(PC、Android 和 iOS)提供 SSL 接入连接服务。最近有用户反馈其手机上 App 不能正常连接登录,别人手机上都可以。经过单独回访调查该用户使用的手机操作系统是 Android 6.0,经搜索了解了 Android 6.0 之后 Google 使用了自家的 BoringSSL 替换了原来的 OpenSSL,怀疑是这里在捣鬼。

继续搜索类似问题解决方案,在参考[1] 中找到答案:

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 拒绝。

明了了原因后我们只好把 JDK 从 6 升级到了 8,顺利解决 Android6.0 SSL 握手失败问题。但解决完这个后,没多久又发现 APNS iOS 推送又不可用了,和苹果推送服务器建立 SSL 连接失败,无法推送消息。唯一的变化就是升级到了 JDK8 自然就将怀疑目标对准了 JDK8。

继续 Google 一把找了同类受害者,他已经搞明白了原因,见参考[2]

The problem was the exported keystore (in PKCS12 format) contained the private key as well as the production certificate and the development certificate for push notifications. Java can use keystores in the PKCS12 format. But Java 6 and Java 8 did not read-in the keystore the same way. It looks like Java 6 read in the production certificate for the private key and Java 8 read in the development certificate.

解决办法也很简单,先用 JDK6 提供的 keytool 将 .p12 格式的证书转换为 .jks 格式。再用 JDK8 提供的 keytool 将刚生成的 .jks 证书转换为 .p12 格式。转换命令如下:

.p12 -> .jks
/JDK6/keytool -importkeystore -destkeystore apns.jks -srckeystore apns_jdk6.p12 -srcstoretype PKCS12

.jks -> .p12
/JDK8/keytool -importkeystore -srckeystore apns.jks -srcstoretype JKS -deststoretype PKCS12 -destkeystore apns_jdk8.p12

参考

[1] liuxian233. Android 6.0 HTTPS连接ssl3_get_server_key_exchange:BAD_DH_P_LENGTH错误问题
[2] szediwy. Apple Push Notification with Java
[3] ASHISH PARAB. APPLE PUSH NOTIFICATION SERVICE CERTIFICATE ISSUE WITH JDK 7


写点文字,画点画儿,「瞬息之间」一切都变了。觉得不错,可长按或扫描二维码关注。

相关 [最近 ssl 问题] 推荐:

最近碰到的一些 SSL 问题记录

- - mindwind
最近碰到一些 SSL 的小问题,特记录下. 我们有个 Java 实现的 SSL TCP 服务端,为客户端(PC、Android 和 iOS)提供 SSL 接入连接服务. 最近有用户反馈其手机上 App 不能正常连接登录,别人手机上都可以. 经过单独回访调查该用户使用的手机操作系统是 Android 6.0,经搜索了解了 Android 6.0 之后 Google 使用了自家的 BoringSSL 替换了原来的 OpenSSL,怀疑是这里在捣鬼.

[Android]用WebView访问证书有问题的SSL网页

- - idv2
在WebView里加载SSL网页很正常,也没什么难度. 但如果要加载的SSL页面的证书有问题,比如过期、信息不正确、发行机关不被信任等,WebView就会拒绝加载该网页. PC上的浏览器会弹出证书错误的对话框,提示你是否要无视错误继续浏览. 实际上在WebView里也可以这样做,以实现加载证书有问题的页面.

nginx配置ssl

- - 邢红瑞的blog
先生成网关证书 ,仿照CA模式.

SSL原理笔记

- - CSDN博客推荐文章
搜索SSL握手的原理,最多是网上转载的Alice和Bob的对话. 用生动、形象的场景说明了一个复杂SSL握手原理. 用公钥加密的数据只有私钥才能解密,相反的,用私钥加密的数据只有公钥才能解密,正是这种不对称性才使得公用密钥密码系统那么有用. 是一个验证身份的过程,目的是使一个实体能够确信对方是他所声称的实体.

SSL工作原理

- - 互联网 - ITeye博客
SSL 是一个安全协议,它提供使用 TCP/IP 的通信应用程序间的隐私与完整性. 超文本传输协议 (HTTP)使用 SSL 来实现安全的通信. 在客户端与服务器间传输的数据是通过使用对称算法(如 DES 或 RC4)进行加密的. 公用密钥算法(通常为 RSA)是用来获得加密密钥交换和数字签名的,此算法使用服务器的SSL数字证书中的公用密钥.

SSL窃听攻击实操

- snowflip - 狂人山庄 | Silence,声仔,吴洪声,奶罩
OK,我恶毒的心灵又开始蠢蠢欲动了. 今天带给大家的是SSL窃听攻击从理论到实际操作的成功例子. SSL窃听最主要的是你要有一张合法的SSL证书,并且证书名称必须和被攻击的网站域名一致. 目前各大CA都有很低廉价格的SSL证书申请,最低的价格只需要10美元不到,甚至还有一些域名注册商大批量采购这些证书,并且在你注册域名的时候免费送你一张.

Tomcat7配置双向SSL

- - CSDN博客推荐文章
//ca-cert.pem即为CA根证书,可将其下发到客户端,导入作为根证书.  如果按请求生成CA证书,由证书申请者生成请求文件certreq.txt. CA端执行签名,生成证书文件1.cer. 4.将证书导出成浏览器支持的.p12格式,密码changeit. 4.将证书导出成浏览器支持的.p12格式 :.

图解SSL/TLS协议

- - 阮一峰的网络日志
本周, CloudFlare宣布,开始提供Keyless服务,即你把网站放到它们的CDN上,不用提供自己的私钥,也能使用SSL加密链接. 我看了CloudFlare的说明( 这里和 这里),突然意识到这是绝好的例子,可以用来说明SSL/TLS协议的运行机制. 下面,我就用这些图片作为例子,配合我半年前写的 《SSL/TLS协议运行机制的概述》,来解释SSL协议.

SSL延迟有多大?

- - 阮一峰的网络日志
据说,Netscape公司当年设计 SSL协议的时候,有人提过,将互联网所有链接都变成HTTPs开头的加密链接. 这个建议没有得到采纳,原因之一是HTTPs链接比不加密的HTTP链接慢很多. (另一个原因好像是,HTTPs链接默认不能缓存. 自从我知道这个掌故以后,脑袋中就有一个观念:HTTPs链接很慢.

Netty SSL性能调优

- - ImportNew
嗯,这篇不长的文章,是一个晚上工作到三点的血泪加班史总结而成. 《 TLS协议分析 与 现代加密通信协议设计》 首先要感谢这篇文章,如果没有它,我可能还要花更多的时间才能完成. 文章有点长,能看多少是多少,每句都是收获. 目前(2015年)已经不安全,必须禁用. 互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版.