當前為10.0版本文檔,更多實例內容將在最新幫助文檔中展現,點選跳轉至 最新版幫助文檔

10.0下HTTPS環境配置WebSocket

1. 概述

1.1 問題描述

HTTP 是超文本傳輸協議,信息是明文傳輸的。HTTPS 協議是由 SSL+HTTP 協議構建的可進行加密傳輸、身份認證的網絡協議,比 HTTP 協議安全。

可以通過兩種方法在 HTTPS 環境中配置 WebSocket,下面将詳細介紹。

1.2 解決思路

方法一:如果沒用 Nginx,可以直接在 Web 服務器上配置 SSL。

方法二:如果用了 Nginx 反向代理服務器,那麽可以在 Nginx 上配置 SSL,而應用服務器如 Tomcat 不配置 SSL。這樣客戶端和 Nginx 之間走 https 通訊,Nginx 和 Tomcat 之間通過 proxy_pass 走 http 通訊。

注:JAR 包時間在 2019-12-05 之後的報表工程,支持在數據決策系統中,通過可視化界面設置 WebSocket 。詳情請參見:常規 第三章

2020-10-20_15-55-20.png

2. 方法一

以 Windows 系統下使用方法一配置 WebSocket 爲例。

2.1 搭建 HTTPS 環境

搭建 HTTPS 環境的詳細内容參見:配置SSL證書實現HTTPS訪問

2.2 配置數據庫

在 FineDB 的 fine_conf_entity 表中添加以下 4 個參數項,參數信息如下表所示:

新增步驟請參見:報表内置HSQL數據庫FineDB

  參數項參數值  
WebSocketConfig.protocolssl(默認)
WebSocketConfig.keyStore來自%TOMCAT_HOME%\conf\server.xml中的 keystoreFile 字段的值
WebSocketConfig.keyStorePassword來自%TOMCAT_HOME%\conf\server.xml中的 keystorePass 字段的值
WebSocketConfig.keyStoreFormatJKS(默認) 

WebSocketConfig.keyStore 和 WebSocketConfig.keyStorePassword 的配置如下圖所示:

注:fine_conf_entity 表中的WebSocketConfig.keyStore的值必須是絕對路徑,不可以是相對路徑。

1.png

數據庫表中新增信息如下圖所示:

1571810654997930.png

配置完成之後,重啓報表服務器即可生效。

注:Https 配置 WebSocket 後,Http下 WebSocket 會請求不到。

3. 方法二

以 Linux+Nginx+Tomcat 下使用方法二配置 WebSocket 爲例。

注:非必要請勿使用自簽名證書,使用自簽名證書有可能會導緻部分記錄丢失,詳情請參見 4.1 節。

3.1 生成自簽名的SSL證書

注:已有證書的可以跳過該步驟。

1)安裝 OpenSSL 并驗證。

# yum install openssl openssl-devel

# openssl version -a

2)生成密鑰文件 server.key。

# openssl genrsa -des3 -out server.key 2048

生成密鑰文件時會要求設置密碼,設置好密碼後需要記住這個密碼。

1.png

這樣就生成了 server.key 文件。此後用到了該文件會經常要求輸入密碼。如 Nginx 加載了該 server.key,啓動時會要求輸入密碼。

image2019-1-4_14-42-36.png

如果嫌麻煩,可以用以下命令生成 server.key,這樣就不再需要輸入密碼。

# openssl rsa -in server.key -out server.key

3)生成服務器證書的申請文件 server.csr。

# openssl req -new -key server.key -out server.csr

image2019-1-4_15-4-42.png

Country Name 填 CN,Common Name 填主機名,不填的話浏覽器會提示不安全,其餘均可爲空。

4)生成 CA 證書 ca.crt。

# openssl req -new -x509 -key server.key -out ca.crt -days 3650

CA證書用於給自己的證書簽名。

5)生成服務器證書 server.crt。

# openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt

6)查看生成的5個文件,其中 server.crt 和 server.key 就是 Nginx 需要的證書文件。

image2019-1-4_15-11-20.png

3.2 Nginx配置HTTPS

HTTP 默認端口是 80,HTTPS 默認端口是 443。

Nginx配置完整版:nginx-demo .conf

注意:修改 nginx.conf 後,重啓 Nginx 時不要用 reload,要用 stop 和 start,否則配置可能不生效。

1)配置443端口

server {
        listen       443 ssl;
        server_name  192.168.5.232;
     
        ssl_certificate      /mnt/hgfs/share/keys/server.crt; #證書絕對路徑
        ssl_certificate_key  /mnt/hgfs/share/keys/server.key; #key絕對路徑
        ssl_session_cache    shared:SSL:1m; #儲存SSL會話的緩存類型和大小  
        ssl_session_timeout  5m; #會話過期時間
 
        ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; #爲建立安全連接,服務器所允許的密碼格式列表
        ssl_prefer_server_ciphers  on; #依賴SSLv3和TLSv1協議的服務器密碼将優先於客戶端密碼
     
        #禁止在header中出現服務器版本,防止黑客利用版本漏洞攻擊
        #server_tokens off;
        #如果是全站 HTTPS 并且不考慮 HTTP 的話,可以加入 HSTS 告訴浏覽器本網站全站加密,并且強制用 HTTPS 訪問
        #fastcgi_param   HTTPS               on;
        #fastcgi_param   HTTP_SCHEME         https;
     
        location / {
            proxy_http_version 1.1;
            proxy_set_header Connection "";
 
            proxy_buffering off;
            proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header non_idempotent;
 
            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;
            # 把 HTTPS 的協議告知容器(如tomcat),否則容器可能認爲是 HTTP 的請求
            proxy_set_header X-Forwarded-Proto $scheme;
             
            proxy_connect_timeout    20;
            proxy_read_timeout       1000;
            proxy_send_timeout       300;
 
            proxy_pass http://FR.com;
        }
顯示代碼

2)配置 WebSocket 端口

WebSocket 配置 HTPPS 很容易出問題,集群啓動後,可在智能運維>内存管理中,看實時内存圖是否顯示。

server { 
      listen       38889 ssl;            
      server_name  192.168.5.232;
 
      ssl_certificate      /mnt/hgfs/share/keys/server.crt;
      ssl_certificate_key  /mnt/hgfs/share/keys/server.key;
 
      ssl_session_cache    shared:SSL:1m;
      ssl_session_timeout  5m;
 
      ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
      ssl_prefer_server_ciphers  on;
      location / {
          proxy_request_buffering off;
          proxy_buffering off;
          proxy_connect_timeout 20;
          proxy_read_timeout 1000;
          proxy_send_timeout       300;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
          proxy_pass http://WBS.com;
       }
  }
顯示代碼

Nginx 轉發默認監聽38889端口,節點的 WebSocket默認監聽38888端口,可自行修改。轉發端口是fine_conf_entity表中的字段WebSocketConfig.requestPorts,且支持配置多個端口進行多次轉發,如下所示:

id

value

WebSocketConfig.port38888
WebSocketConfig.requestPorts38889

轉發端口可直接在前台進行配置,可參考文檔:常規 第三章

注:2019-09-27 及之前版本的 JAR 包,轉發端口生效字段是 WebSocketConfig.requestPort 且只支持一個端口。如下所示:

idvalue
WebSocketConfig.port38888
WebSocketConfig.requestPort38889

3)配置 HTTP 強轉 HTPPS

rewrite ^(.*)$  https://$server_name$1 permanent;

4)Nginx 跨域設置

add_header access-control-allow-Headers X-Requested-With;
add_header access-control-allow-Methods GET,POST,OPTIONS;

注:Nginx 跨域配置不能加上「add_header access-control-allow-Origin *;」這個前端應該是已經有過配置,增加會導緻前端無法選擇跨域配置,而導緻錯誤。

4. 注意事項

4.1 部分浏覽器設置不生效

1)問題描述

使用方法二進行配置後,火狐浏覽器訪問還是空白,IE 浏覽器訪問模板沒有記錄。

這是因爲自簽名的證書不被浏覽器信任,頁面能訪問是因爲手動添加了例外,但是38888端口沒有,所以浏覽器攔截了 Socket 請求。

2)解決方案

F12看一下攔截的請求,複制下來,直接訪問一下38888端口添加安全例外或者手動添加。

1552632213Ey2N4v2s.png
1552632230ReRczyKU.png

這樣浏覽器就可以查看實時内存了,如下圖所示:

1552632336hewk50V0.png

4.2 不額外給 WebSocket 開端口

1)問題描述

采用方法二配置 WebSocket,由於現在 WebSocket 采用的是 netty-socketio,它有一個問題就是需要另開一個新的端口,在一些特定情況下,客戶出於安全考慮或者其他原因,不能爲工程多開一個端口,這種情況下後台的 Socket 服務不能成功啓動,造成 Socket 連接失敗,從而導緻平台的部分功能使用有問題。

那麽如何在只開放一個端口的情況下解決上述問題呢?

2)解決方案

在 FineDB 的 fine_conf_entity 表中添加一個參數項:

字段
WebSocketConfig.requestPorts80

注:2019-09-27及之前版本的JAR包,轉發端口生效字段是WebSocketConfig.requestPort且只支持一個端口,如下所示:

字段
WebSocketConfig.requestPort80

Nginx 監聽 server 下加上如下内容:

...
server {
        listen 80;#監聽端口,這個要和上面的WebSocketConfig.requestPort一緻
        server_name _;
        underscores_in_headers on;
 
        location / {
            proxy_http_version 1.1;
            proxy_pass http://FR.com;
            proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header non_idempotent;
            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_set_header Connection "";
            #proxy_set_header X-Forwarded-Proto "https";
            proxy_connect_timeout 20;
            proxy_read_timeout 1000;
            proxy_send_timeout 300;
        }
        #這裏匹配/socket.io/轉發給websocket的upstream
        location ^~ /socket.io/ {
            proxy_pass http://WBS.com;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_connect_timeout 20;
            proxy_read_timeout 1000;
            proxy_send_timeout 300;
        }
        ...
}
...
顯示代碼

最後重啓 Nginx 和報表工程即可。

4.3 實時内存不顯示

10.0下 HTTPS 環境若不配置 WebSocket,那麽智能運維的實時内存圖表空白,而且平台會登錄信息失效,如下圖所示:

15526213733TS7lSPX.png

按照上述方法配置 WebSocket 後,重啓 Tomcat 服務器,智能運維的實時内存就可以正常顯示了,如下圖所示:

1552630099rNE4Jz59.png

附件列表


主題: 原簡體文檔
  • 有幫助
  • 沒幫助
  • 只是瀏覽

文 檔回 饋

滑鼠選中內容,快速回饋問題

滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。

不再提示

9s后關閉

反饋已提交

網絡繁忙