之前公司开发的小程序已经运行很久了,当初在nginx上面配置https还是蛮简单的,加载申请的证书就没啥问题了,现在服务器快要到期了,先迁移到临时服务器保证这段时间可以运行,就百度找一些教程一会就解决了,可问题来了,ios和测试工具上面都请求成功,但是安卓上面请求失败,提示请求超时(.其实是提示错误)。
当初快过年了,已经无心工作,简单的看了一下代码,发现请求超时是在判断http响应code不等于200时弹出的提示,这就瞬间蒙蔽了,我在各种环境下面访问这个接口发现接口请求都是200的响应值,也去小程序官方论坛上面求职,因为提示的误导一直没有找到解决办法。
初七上班了,这小程序(内部使用的)还不能用就影响员工了,仔细把代码看一遍(确实写的很烂),才发现这个提示 在success和fail都是这个提示,就在测试工具上面写个测试接口,打印请求的响应结果,才发现问题是ssl握手失败( request:fail ssl hand shake error ),就再把官方文档看了一会,感觉就是tls版本的问题,微信要求tls版本需要支持1.2以及1.2以上。
问题发现了,就找资料查看怎么让服务器支持这个版本协议,看起来很简单:
SSLProtocol All -SSLv2 -SSLv3 //除了v2 和 v3以外其他的都支持
重启apache以后,发现还是请求失败,这就让我怀疑人生了,难道没有生效,找到网址查了一下
这不是支持的好好的么,怎么还是握手失败,如果ios和pc都失败了码,那很有可能是正式的问题,现在就只有安卓真机上面请求失败(ssl握手失败),这就很蛋疼了。
后续看到一些人的blog上面配置apache 的https发现有的人携带了 SSLCACertificateFile 的路径,有的没携带,因为我记得申请的证书好像有这个文件(对应apache特有的),就试着带上这个参数,果然,加上之后安卓上面测试就没问题了,当初配nginx时候没有这个文件,就一直以为不需要这个根证书。
这里附上 apache 虚拟主机配置ssl的参数
<VirtualHost *:443>DocumentRoot ".../htdocs" ServerName xxx:443SSLEngine onSSLCertificateFile /etc/apache2/ssl/2_xxx.crtSSLCertificateKeyFile /etc/apache2/ssl/3_xxx.keySSLCACertificateFile /etc/apache2/ssl/1_root_bundle.crt..错误日志目录...</VirtualHost>
这里提供一下解决思路
1. 小程序上https请求失败,先看这个https证书是否可用,用几个浏览器打开这个网址看看
2. 证书没问题,可以看看是不是服务器的tls版本的问题(附上检测网址 https://www.ssllabs.com/ssltest/index.html )
3. 如果tls的版本也没问题,那可以考虑是不是也和我一样这个配置问题(缺少了根证书文件)