微信小程序不只要求必须是HTTPS和WSS,还要求URL里不能有端口号。php
常见的服务器有三种:html
这三种服务器均可以配置https,可是不必所有知道,由于Nginx能够起到反向代理的做用,会配置Nginx就足够了。nginx
HTTP协议默认端口号是80,HTTPS默认端口号是443。
HTTPS协议=HTTP+SSL,而SSL是基于公钥加密算法的。当咱们访问一个使用了HTTPS的网站时,这个网站将它的公钥告知浏览器,浏览器在发送请求数据时会使用公钥对数据进行加密,这样一来就不怕有人监听数据包了,由于只有拥有私钥,才可以“理解”这些数据包。
对于普通的HTTP数据包,都是未加密的,很容易被监听。好比,当咱们连上一个wifi后,咱们的一切流量都用从路由器上通过,这个路由器接上抓包软件就可以看到一切,不加密的数据包简直至关于裸奔!因此,不要贪图便宜链接不知来源的wifi,更不要在不信任的wifi下填写密码表单,那样很容易泄露我的信息。而HTTPS协议可以大大解决这个问题。web
对于一个现代化的网站,若是拥有本身的用户,那么就必定有使用HTTPS的必要。要全网站都是用HTTPS而不是部分连接使用HTTPS,由于访问HTTP连接的时候携带着跟访问HTTPS连接时如出一辙的cookie,这就有可能泄露sessionId,而泄露sessionID跟泄露密码差不太多。算法
HTTPS并不是百利而无一害,它对服务器性能提出了更高的要求。由于加密、解密的过程也是一个不可忽略的性能消耗。小程序
获取SSL证书,最简单、最正确的姿式是使用腾讯云,申请SSL,这个过程是免费的,而且不须要任何命令行。
连接以下:
https://cloud.tencent.com/product/ssl微信小程序
若是不想了解更多关于证书的内容,能够跳过下面。浏览器
配置一个HTTPS服务所须要的证书包括几个部分:服务器
建立证书的基本流程是这样:微信
本身生成证书最大的坏处就是,访问此网站时,浏览器会提示证书不受信任。
# 一、首先,进入你想建立证书和私钥的目录,例如: cd /etc/nginx/ # 二、建立服务器私钥,命令会让你输入一个口令: openssl genrsa -des3 -out server.key 1024 这句话生成server.key,这个文件长度为1024字节,这就是私钥,是服务器用来解码用户请求的宝贝。 # 三、建立签名请求的证书(CSR): openssl req -new -key server.key -out server.csr # 四、在加载SSL支持的Nginx并使用上述私钥时除去必须的口令: cp server.key server.key.org openssl rsa -in server.key.org -out server.key # 五、最后标记证书使用上述私钥和CSR: openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.c
第3个命令是生成证书请求,会提示输入省份、城市、域名信息等,重要的是,email必定要是你的域名后缀的。这样就有一个 csr 文件了,提交给 ssl 提供商的时候就是这个 csr 文件。固然我这里并无向证书提供商申请,而是在第4步本身签发了证书。
在/etc/nginx/conf.d目录下新建https.conf
upstream websocket{ server weiyinfu.cn:8080; } upstream web{ server weiyinfu.cn:8080; } server { listen 443; server_name weiyinfu.cn; ssl on; ssl_certificate /etc/nginx/weiyinfu.cn/Nginx/1_weiyinfu.cn_bundle.crt; ssl_certificate_key /etc/nginx/weiyinfu.cn/Nginx/2_weiyinfu.cn.key; ssl_session_timeout 5m; ssl_session_cache shared:SSL:50m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv2 SSLv3; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; location /wss { access_log /var/log/nginx/come-websocket.log; proxy_pass http://websocket/; # 代理到上面的地址去 proxy_read_timeout 60s; proxy_set_header Host $host; proxy_set_header X-Real_IP $remote_addr; proxy_set_header X-Forwarded-for $remote_addr; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'Upgrade'; } location / { #root html; #index testssl.html index.html index.htm; access_log /var/log/nginx/https-reverse.log; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://weiyinfu.cn/; } }
此文件包含两部分,第一部分配置wss,第二部分配置https
server { listen 192.168.1.111:80; server_name test.com; rewrite ^(.*)$ https://$host$1 permanent; }
举例:将访问目录 \services 由http访问 重定向到 https (解决方法:nginx rewrite 加上 location 方式实现)
location ~ /services/.*$ { if ($server_port ~ "^80$"){ set $rule_0 1$rule_0; } if ($rule_0 = "1"){ rewrite /(.*) https://IP地址/$1 permanent; break; } }
nginx -t 命令测试一下
service nginx reload从新加载配置
观察/var/log/nginx查看日志
/usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful (显示表示配置文件没有错误) service nginx reload (从新加载nginx服务) netstat -lan | grep 443 (查看443端口)
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN (有看到这一行 就表示HTTPS已经在工做了)
官网文档http://nginx.org/en/docs/http/websocket.htm
http://www.wxapp-union.com/portal.php?mod=view&aid=2105
http://www.cnblogs.com/yun007/p/3739182.html
关于HTTPS详尽的介绍