小程序更换服务器导致ssl证书的问题

  之前公司开发的小程序已经运行很久了,当初在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:443
SSLEngine on
SSLCertificateFile    /etc/apache2/ssl/2_xxx.crt  
SSLCertificateKeyFile /etc/apache2/ssl/3_xxx.key  
SSLCACertificateFile  /etc/apache2/ssl/1_root_bundle.crt 
..错误日志目录
...
</VirtualHost>

  

  这里提供一下解决思路

  1. 小程序上https请求失败,先看这个https证书是否可用,用几个浏览器打开这个网址看看

  2. 证书没问题,可以看看是不是服务器的tls版本的问题(附上检测网址 https://www.ssllabs.com/ssltest/index.html ) 

  3. 如果tls的版本也没问题,那可以考虑是不是也和我一样这个配置问题(缺少了根证书文件)

 

posted @ 2018-02-22 13:53  Axierty  阅读(4692)  评论(0编辑  收藏  举报