iOS 与 Java 服务器之间 SSL 握手失败的解决:Cipher Suites
太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)
本文遵循“署名-非商业用途-保持一致”创作公用协议
终极解决:
------------------
iOS 与 Java 服务器通讯建立 SSL 通道过程中,Java 服务器先报异常,然后把异常最后捕获点,返回给 iOS 客户端,但 Java 服务器端确有一个掩盖的事实异常,那就是找不到 Cipher Suites,由此字面意思,就清楚地知道,是 Java 服务器没有找到可用于 iOS 客户端要求的加密套件。
之前解决,其实也是误解,实际上是那台服务器上具有完整的加密套件而已。
这要追溯到 JDK 的安全机制包:local_policy.jar、US_export_policy.jar
Mac 下,10.10.2 默认未安装或禁用了升级前版本的 JDK,故从 Oracle 官网下载安装 JDK 1.8 后的位置:
/Library/Java/JavaVirtualMachines/1.6.0_65-b14-462.jdk/Contents/Home/lib/security
Windows 64 位 JDK 下的位置:
C:\Program Files\Java\jdk1.6.0_45\jre\lib\security
Windows 64 位 JRE 下的位置:
C:\Program Files\Java\jre6\lib\security
在 Oracle 官网搜 JCE (Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy),就会找到最新版本 JDK1.7 和 JDK1.8 对应的包,解压出来,就包含了 local_policy.jar、US_export_policy.jar 两个包,替换上面对应版本 JDK 该包位置下的文件即可。
有时会不好用,需要重启电脑,清空 Eclipse 工作空间等等,但一定会好用。
JDK 1.6 版对应的 JCE 在 CSDN 下载频道,可以搜到,目前 Oracle 官网能下载到 JDK 1.7、1.8 对应的 JCE,在 JDK 下载页下方仔细找 Java Cryptography Extension 。
------------------
好久没填坑了,不过这回这个感觉非常有必要填一填,因为我的猜测,终于验证了,虽然不是我印证的,那更需要好好记一记,这个Cipher Suites 后面的事情,太不可思议了。
不可思议,这牵扯到美国对华软件出口限制。。。。。。类似的情况
http://www.brieftools.info/article/62392
http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
-------------------
先挖个坑,有机会填,没机会填也属正常,毕竟地球表面也布满了坑,只不过我们叫盆地或高山而已。
Cipher Suites :加密套件?也许这么翻译也不准确,不过 SSL 官方有说明,一组 RSA、3DES 或 MD5,也或者其它对称或非对称加密算法的组合。
SSL 拨手开篇即道:HelloClient,同时带着相关设置,其中就包含着这个 Cipher Suites 的名字。
iOS 和 Java 所支持的加密套件并不完全一样,可能有个交集,但实际获得到的 Java 的套件,在 iOS 上虽然都有,不过并不是都可用,可能有些是 Mac 的吧。
所以当 iOS 向 Java 服务器请求 SSL 通道建立时,HelloClient 发出后,带着的设置中,就有加密套件名称,Java 服务端通过该名称查找其支持的套件中是否存在,如果不存在,那么就报错了 not found cipher suites in common。
这句英文一直没搞清是干啥的,不过一直知道是服务端报的异常,而网上把国内国外都翻了个底儿朝天,也没人就此问题有一个很好的解答。
那么,看到这里基本应该明白了。
后续有时间,把过程整理出来,最好是带图的,格式化得很好的,俺自个儿也稀汗有美感的文章,不过时间总是那么着急,回头再说吧。