HTTPS配置WebSocket

1. 概述

1.1 問題描述

HTTP 是超正文傳輸協定,資訊是明文傳輸的。HTTPS 協定是由 SSL+HTTP 協定構建的可進行加密傳輸、身分認證的網路協定,比 HTTP 協定安全。

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

注:5.1.20 及之後版本的BI工程,新增了一個容器Websocket方案。推薦優先查看是否可使用該方案:容器Websocket方案

無需任何使用者操作,無需任何手動配置,無需額外開啟埠,系統可自動使用Web容器自帶的WebSocket進行連結,埠複用http埠。

1.2 解決思路

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

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

注1:JAR 包時間在 2019-12-05 之後的工程,支援在數據決策系統中,透過視覺化介面設定 WebSocket 。詳情請參見:標準 第三章

注2:11.0.2 及之後版本,新增一個容器 websocket 方案,幫助使用者實現快速配置 websocket 埠。

       若「管理系統>系統管理>標準」頁面不顯示Websocket設定項,說明此方案生效,Websocket 連結已正確配置,無需其他任何手動配置。

2. 方法一:未配置代理

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

2.1 搭建 HTTPS 環境

搭建 HTTPS 環境的詳細內容參見:配置SSL憑證實現HTTPS存取

2.2 配置資料庫

在 FineDB 的 fine_conf_entity 表中新增以下 4 個參數項,參數資訊如下表所示:

參數項參數值  
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的值必須是絕對路徑,不可以是相對路徑。

資料庫表中新增資訊如下圖所示:

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

注: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

生成金鑰檔案時會要求設定密碼,設定好密碼後需要記住這個密碼。

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

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

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

3)生成伺服器憑證的申請檔案 server.csr。

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

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 需要的憑證檔案。

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 配置 HTTPS 很容易出問題,叢集啟動後,可在智慧維運>記憶體管理中,看實時記憶體圖是否顯示。

server { 
      listen       48889 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預設監聽48888埠,可自行修改。轉發埠是fine_conf_entity表中的參數項WebSocketConfig.requestPorts,且支援配置多個埠進行多次轉發,如下所示:

id

value

WebSocketConfig.port48888
WebSocketConfig.requestPorts48889

轉發埠可直接在前臺進行配置,可參考文檔:標準 第三章

注:2019-09-27 及之前版本的 JAR 包,轉發埠生效參數項是 WebSocketConfig.requestPort 且只支援一個埠。如下所示:

idvalue
WebSocketConfig.port48888
WebSocketConfig.requestPort48889

3)配置 HTTP 強轉 HTTPS

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 部分瀏覽器設定不生效

問題描述:

使用方法二進行配置後,火狐瀏覽器存取還是空白,IE 瀏覽器存取範本沒有記錄。

這是因為自簽章的憑證不被瀏覽器信任,頁面能存取是因為手動新增了例外,但是48888埠沒有,所以瀏覽器攔截了 Socket 請求。

解決方案:

F12看一下攔截的請求,複製下來,直接存取一下48888埠新增安全例外或者手動新增。


這樣瀏覽器就可以查看實時記憶體了,如下圖所示:

4.2 其他

1)金鑰路徑:

  • Tomcat 配置中 server.xml 裏面絕對路徑/相對路徑都可以。

  • 數據決策系統中「系統管理>標準>https 設定」中「SSL 金鑰路徑」只支援絕對路徑。

2)設計器不支援配置 HTTPS,EXE 安裝的 BI 不支援配置 HTTPS。

3)若 Nginx 配置了 https,那麼就不要在「系統管理>標準>https」設定中進行配置。

4)Tomcat 工程配置了 https,http 和 https 都可以存取工程。但是 websocket 不能同時支援,https 連結正常,http 就會連結失敗。

     Nginx 工程無影響,websocket 可同時支援。

附件列表


主题: 管理系統
已经是第一篇
已经是最后一篇
  • 有帮助
  • 没帮助
  • 只是浏览
  • 圖片不清晰
  • 用語看不懂
  • 功能說明看不懂
  • 操作說明太簡單
  • 內容有錯誤
中文(繁體)

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

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

不再提示

10s後關閉

獲取幫助
線上支援
獲取專業技術支援,快速幫助您解決問題
工作日9:00-12:00,13:30-17:30在线
頁面反饋
針對當前網頁的建議、問題反饋
售前咨詢
業務咨詢
電話:0933-790886或 0989-092892
郵箱:taiwan@fanruan.com
頁面反饋
*問題分類
不能為空
問題描述
0/1000
不能為空

反馈已提交

网络繁忙