添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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 埠。

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

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

2.1 搭建 HTTPS 環境

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

2.2 配置資料庫

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

參數項 參數值
WebSocketConfig.protocol ssl(預設)
WebSocketConfig.keyStore 來自 %TOMCAT_HOME%\conf\server.xml 中的 keystoreFile 欄位的值
WebSocketConfig.keyStorePassword 來自 %TOMCAT_HOME%\conf\server.xml 中的 keystorePass 欄位的值
WebSocketConfig.keyStoreFormat JKS(預設)

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

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

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

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

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

以 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 https:///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 https:///WBS.com;
       }
  }

Nginx 轉發預設監聽38889埠,節點的 WebSocket預設監聽48888埠,可自行修改。轉發埠是fine_conf_entity表中的參數項WebSocketConfig.requestPorts,且支援配置多個埠進行多次轉發,如下所示:

id

value

WebSocketConfig.port 48888
WebSocketConfig.requestPorts 48889

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

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

id value
WebSocketConfig.port 48888
WebSocketConfig.requestPort 48889

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

問題描述:

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

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

解決方案:

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


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

4.2 其他

1)金鑰路徑:

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

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

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

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