Nginx配置https和wss


微信小程序不僅要求必須是HTTPS和WSS,還要求URL里不能有端口號。

一、使用Nginx足夠了

常見的服務器有三種:

  • Nginx
  • IIS
  • Apache

這三種服務器都可以配置https,但是沒必要全部知道,因為Nginx可以起到反向代理的作用,會配置Nginx就足夠了。

二、關於HTTPS協議

HTTP協議默認端口號是80,HTTPS默認端口號是443。
HTTPS協議=HTTP+SSL,而SSL是基於公鑰加密算法的。當我們訪問一個使用了HTTPS的網站時,這個網站將它的公鑰告知瀏覽器,瀏覽器在發送請求數據時會使用公鑰對數據進行加密,這樣一來就不怕有人監聽數據包了,因為只有擁有私鑰,才能夠“理解”這些數據包。
對於普通的HTTP數據包,都是未加密的,很容易被監聽。比如,當我們連上一個wifi后,我們的一切流量都用從路由器上經過,這個路由器接上抓包軟件就能夠看到一切,不加密的數據包簡直相當於裸奔!所以,不要貪圖便宜連接不知來源的wifi,更不要在不信任的wifi下填寫密碼表單,那樣很容易泄露個人信息。而HTTPS協議能夠大大解決這個問題。

對於一個現代化的網站,如果擁有自己的用戶,那么就一定有使用HTTPS的必要。要全網站都是用HTTPS而不是部分鏈接使用HTTPS,因為訪問HTTP鏈接的時候攜帶着跟訪問HTTPS鏈接時一模一樣的cookie,這就有可能泄露sessionId,而泄露sessionID跟泄露密碼差不太多。

HTTPS並非百利而無一害,它對服務器性能提出了更高的要求。因為加密、解密的過程也是一個不可忽略的性能消耗。

三、獲取SSL證書

獲取SSL證書,最簡單、最正確的姿勢是使用騰訊雲,申請SSL,這個過程是免費的,並且不需要任何命令行。
鏈接如下:
https://cloud.tencent.com/product/ssl

如果不想了解更多關於證書的內容,可以跳過下面。

證書結構

配置一個HTTPS服務所需要的證書包括幾個部分:

  • Server Key(服務器私鑰)
  • CSR(Certificate Signing Request)
  • CRT(X509 Certificate)

創建證書的基本流程是這樣:

  • 生成自己的服務端私鑰
  • 輸入基本信息並用私鑰簽名生成CSR
  • 提交CSR給證書機構CA(免費或商業證書)簽名生成CRT,或自己做CA簽名生成CRT(自簽名證書)。自簽名證書和證書機構簽名生成證書前兩個步驟都是一樣的,在這里統一說明一下。

自己生成證書(即公私鑰)

自己生成證書最大的壞處就是,訪問此網站時,瀏覽器會提示證書不受信任。

# 1、首先,進入你想創建證書和私鑰的目錄,例如:
cd /etc/nginx/

# 2、創建服務器私鑰,命令會讓你輸入一個口令:
openssl genrsa -des3 -out server.key 1024
這句話生成server.key,這個文件長度為1024字節,這就是私鑰,是服務器用來解碼用戶請求的寶貝。

# 3、創建簽名請求的證書(CSR):
openssl req -new -key server.key -out server.csr

# 4、在加載SSL支持的Nginx並使用上述私鑰時除去必須的口令:
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key


# 5、最后標記證書使用上述私鑰和CSR:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.c

第3個命令是生成證書請求,會提示輸入省份、城市、域名信息等,重要的是,email一定要是你的域名后綴的。這樣就有一個 csr 文件了,提交給 ssl 提供商的時候就是這個 csr 文件。當然我這里並沒有向證書提供商申請,而是在第4步自己簽發了證書。

四、配置Nginx

在/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

五、將http重定向到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詳盡的介紹


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM