微信小程序不只要求必須是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詳盡的介紹