10.0下HTTPS环境配置WebSocket

编辑
  • 文档创建者:susie
  • 浏览次数:2565次
  • 编辑次数:15次
  • 最近更新:Leo.Tsai 于 2019-11-15
  • 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 通讯。

    2. 方法一

    以 Windows 系统下使用方法一配置 WebSocket 为例。

    2.1 搭建HTTPS环境

    搭建HTTPS环境的详细内容参见:配置SSL证书实现HTTPS访问

    2.2 配置数据库

    1)如果 FineDB 没有迁移到外置数据库,那么根据HSQL 数据库连接方式报表内置HSQL数据库FineDB或者直接使用第三方管理软件连接报表内置HSQL数据库FineDB在 FineDB 的数据库表中新增字段信息。如果 FineDB已经迁移到外置数据库了,那么可以直接使用 Navicat 等数据库管理软件在 FineDB 的数据库表中新增字段信息。

    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 的配置如下图所示:
    1.png

    数据库表中新增信息如下图所示:

    1571810654997930.png

    3)配置完成之后,重启报表服务器即可生效。

    3. 方法二

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

    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 和集群节点装在同一台虚拟机上,为避免冲突,而 Nginx 转发监听38889端口,节点的 WebSocket 监听38888端口。

    可在 fine_conf_entity 表,添加以下两行:

    id

    value

    WebSocketConfig.port38888
    WebSocketConfig.requestPort38889

    3)配置 HTTP 强转 HTPPS

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

    详情参见:Nginx的https配置记录以及http强制跳转到https的方法梳理

    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. 注意事项

    3.1 Firefox设置不生效

    1)问题描述

    修改后火狐浏览器访问还是空白。这是因为自签名的证书不被 Firefox 浏览器信任,页面能访问是因为手动添加了例外,但是38888端口没有,所以浏览器拦截了 Socket 请求。

    2)解决方案

    F12看一下拦截的请求,复制下来,直接访问一下38888端口添加安全例外或者手动添加。

    1552632213Ey2N4v2s.png
    1552632230ReRczyKU.png

    这样火狐浏览器就可以查看实时内存了,如下图所示:

    1552632336hewk50V0.png

    3.2 不额外给WebSocket开端口

    1)问题描述

    采用方法二配置 WebSocket,由于现在 WebSocket 采用的是 netty-socketio,它有一个问题就是需要另开一个新的端口,在一些特定情况下,客户出于安全考虑或者其他原因,不能为工程多开一个端口,这种情况下后台的 Socket 服务不能成功启动,造成 Socket 连接失败,从而导致平台的部分功能使用有问题。

    那么如何在只开放一个端口的情况下解决上述问题呢?

    2)解决方案

    在 FineDB 的 fine_conf_entity 表中添加一个字段:

    字段
    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 和报表工程即可。

    3.3 实时内存不显示

    10.0下 HTTPS 环境若不配置 WebSocket,那么智能运维的实时内存图表空白,而且平台会登录信息失效,如下图所示:

    15526213733TS7lSPX.png

    按照上述方法配置 WebSocket 后,重启 Tomcat 服务器,智能运维的实时内存就可以正常显示了,如下图所示:

    1552630099rNE4Jz59.png

    附件列表


    主题: 部署集成
    标签: 暂无标签
    如果您认为本文档还有待完善,请编辑

    文档内容仅供参考,如果你需要获取更多帮助,付费/准付费客户请咨询帆软技术支持
    关于技术问题,您还可以前往帆软社区,点击顶部搜索框旁边的提问按钮
    若您还有其他非技术类问题,可以联系帆软传说哥(qq:1745114201

    此页面有帮助吗?只是浏览 [ 去社区提问 ]