从 http 升级到 https 过程中遇到的一些问题
来源:互联网 发布:咸阳办公软件电脑培训 编辑:程序博客网 时间:2024/06/07 19:29
Apple 2017年1月1号起要求Appstore 上线的应用都必须使用 https 加密请求协议,在二月份又改为建议 从 http 升级为 https 协议,此为背景。
公司做的APP同时在App Store和安卓应用市场上了线。应要求,我们也将协议升级为https。由于自制https证书不能用于支付宝请求协议,故从阿里云购买的证书服务。升级为https之后碰到了诸多问题。
1.支付宝微信支付成功却收不到notify回调的情况。
支付notify_url 要求回调时 url 不得带任何参数,如果请求为 https 证书必须由认证机构发放,自制证书无效。
微信要求必须为80端口,那么回调请求就应该为http请求。
项目由nginx加tomcat搭建,部署在ECS Linux 上面。那么支付请求如下
1)APP发起支付请求——>
2)支付宝确认签名,如果正确则支付成功——>
3)支付宝给notify_url 发异步通知——>
4)服务器收到异步通知,确认订单状态,结束此次支付请求。
第一步是APP发起请求调用支付宝的接口然后支付宝确认签名验证成功后划款。
问题出在第三步,支付宝给请求支付时预先配好的notify_url 发送异步通知时出现了问题,服务器没有收到异步通知。ngnix 和 tomcat 日志均未显示 支付宝的异步通知请求。在这里可能出现收不到回调的情况有这几种可能:
1》请求协议的问题(http,https)有可能是证书配置出现问题,但是浏览器访问网站都加上了绿色的安全锁,这一点可以排除
2》服务器防火墙配置问题,ESC 的防火墙(iptables)是在阿里云的控制台配置的,在安全组规则公网配置里面,这个默认配置就可以了,不用做改动。
3》nginx 配置问题,nginx做代理服务器请求没有正确转发至后台。这一点我觉得可能性最大。有可能是配置问题导致支付宝回调失败。
首先验证一下配置好证书之后网站是否能够通过 https 校验
这里推荐一个强 https 校验网站,比浏览器校验更加严格
https://www.ssllabs.com/ssltest/
这是阿里建议的ssl配置证书
1 # HTTPS server 2 # server { 3 # listen 443; 4 # server_name localhost; 5 # ssl on; 6 # ssl_certificate cert.pem; 7 # ssl_certificate_key cert.key; 8 # ssl_session_timeout 5m; 9 # ssl_protocols SSLv2 SSLv3 TLSv1;10 # ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;11 # ssl_prefer_server_ciphers on;12 # location / {13 #14 #15 #}16 #}
可以看到此配置只配置了 443 端口监听,443 端口为 https 的默认请求端口。这样的话微信支付回调肯定就收不到了。于是我将配置改为
# HTTPS server# #server {# listen 80;# listen 443 ssl;# server_name localhost;# ssl_certificate cert.pem;# ssl_certificate_key cert.key;# ssl_session_timeout 5m;# ssl_protocols TLSv1.1 TLSv1.2;# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;# ssl_prefer_server_ciphers on;# location / {###}#}
如上,这样nginx 就可以同时支持 http 和 https 请求了。保证微信可以正常支付,但是支付宝还是不行。
项目服务器支持两个项目的线上运营,nginx 采用的虚拟主机配置。也就是说同一台服务器共用https的证书。这个需要开启nginx 的sni服务。查看状态进入nginx安装目录下输入命令:
sbin/nginx -V
nginx version: nginx/1.6.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC)
TLS SNI support enabled
configure arguments: --prefix=/usr/local/webserver/nginx --with-openssl=/usr/local/openssl/openssl-1.0.1g/ --with-http_stub_status_module --with-htt p_ssl_module --with-pcre=/usr/local/tools/pcre/ --add-module=/usr/local/tools/packages/echo-nginx-module-0.60/
可以看到
TLS SNI support enabled
已经开启。如果没有开启,将 nginx 加入 openssl 重新 make && make install 。
然后这个时候在测试支付,微信可以正常支付并受到回调了。这样APP微信支付和公众号支付两条路就走通了。
剩下支付宝支付还是没有收到回调。于是我把支付宝回调调整为http请求在nginx中过滤,如果为 notify请求则重写为 http://notify_url,将项目打包到测试环境测试,果然成功了。剩下的就是将项目打包正式版本,更新了。
这次升级主要是 nginx 的证书配置和 http 和 https 的限制。遇到这样网络请求的问题,将请求全过程的从头到尾的过程多想几遍,再按照请求的流程一步一步排查问题。缩小问题的范围,问题就慢慢浮现出水面了。
- 从 http 升级到 https 过程中遇到的一些问题
- 从 http 升级到 https 过程中遇到的一些问题
- 从 http 升级到 https 过程中遇到的一些问题
- 从 http 升级到 https 过程中遇到的一些问题
- 从 http 升级到 https 过程中遇到的一些问题
- 从 http 升级到 https 过程中遇到的一些问题
- 从 http 升级到 https 过程中遇到的一些问题
- 项目从Delphi 7 升级到Delphi2010过程中遇到的有关FormPaint的问题
- TortoiseSVN从1.2.6升级到1.3.2过程中遇到的问题
- TortoiseSVN从1.2.6升级到1.3.2过程中遇到的问题
- 从JDK 6升级到JDK 7过程中遇到的一个问题
- 从 .net 1.1 升级到 2.0过程中遇到的问题及解决方法
- 从JDK 6升级到JDK 7过程中遇到的一个问题(卸载rpm)
- spring2.5升级到spring4.2过程中遇到的一些问题记录
- websphere4升级到6过程中遇到的问题
- 升级SQL2005到2008过程中遇到的问题
- 某芯片上升级android (kernel 从2.6.29 到 3.0.72)过程中遇到的问题的记录
- 数据收集-升级Nginx服务器,添加HTTPS过程中遇到的问题
- ubuntu 安装Matlab2014
- 常用spring注解的使用
- java语言基础(14)——键盘录入
- Linux源码安装的文件默认的存放路径
- 百度搜索首页推荐【滚滚长江东逝水,浪花淘尽英雄 昔日英雄今犹在,汪国新国画鉴赏】
- 从 http 升级到 https 过程中遇到的一些问题
- 生产线建设1--有了有理论支持的评估体系,才能形成持续进化的闭环
- Linux内核分析(二)之“复杂的操作系统”
- js全屏操作之判断全屏
- 1000. A + B Problem
- PAT (Advanced Level) 1125. Chain the Ropes (25)
- http协议详解
- caffe学习笔记7-python接口绘制网络结构图
- HTML5网页绘画板