2

我不知道是否可以轻松地做到这一点,而且我还没有找到任何关于如何在本地以安全 (HTTPS) 方式运行 shieldsio 的文档。

我遵循了这个描述并且我已经成功地部署了一个工作服务器,但它只监听 HTTP。

我想也许我只需要一些小的重新配置就可以安全地工作,所以我所做的是修改 config/production.yaml

  public:
    bind:
      address: '0.0.0.0'
      port: 5443

    ssl:
      isSecure: true
      key: 'https.key'
      cert: 'https.crt'

我用来生成秘密的步骤是:

openssl genrsa -out https.key
openssl req -new -key https.key -out csr.pem
openssl x509 -req -days 9999 -in csr.pem -signkey https.key -out https.crt
rm csr.pem

重建 docker 映像并再次部署后,服务器开始侦听,但在第一次 HTTP GET 之后,我收到一个错误:

  internal/buffer.js:958
      super(bufferOrLength, byteOffset, length);
      ^

  RangeError: Invalid typed array length: -4095
      at new Uint8Array (<anonymous>)
      at new FastBuffer (internal/buffer.js:958:5)
      at Handle.onStreamRead [as onread] (internal/stream_base_commons.js:187:19)
      at Stream.<anonymous> (/usr/src/app/node_modules/spdy/node_modules/handle-thing/lib/handle.js:120:12)
      at Stream.emit (events.js:412:35)
      at Stream.emit (domain.js:475:12)
      at endReadableNT (/usr/src/app/node_modules/readable-stream/lib/_stream_readable.js:1010:12)
      at processTicksAndRejections (internal/process/task_queues.js:82:21)

客户端 curl 命令返回:

  curl -k https://127.0.0.1:5443
  curl: (52) Empty reply from server

有没有人试图实现同样的目标并取得成功?也许我遗漏了一些明显的东西,我对nodejs不太熟悉。我很感激任何帮助。

谢谢, SilverTux

4

1 回答 1

1

如果有人想实现与我相同的目标,感谢 shields 的开发人员,我找到了解决此问题的方法。

您不能使用该配置将屏蔽部署为 HTTPS 站点,但您可以部署一个 nginx 代理,将 HTTPS 请求转发到 HTTP 屏蔽服务器。为此,您需要 nginx 的以下配置:

server {
    listen 443 http2 ssl;
    listen [::]:443 http2 ssl;
    server_name <your_domain_name>;

    ssl_certificate /etc/ssl/certs/<your_domain_name>.crt;
    ssl_certificate_key /etc/ssl/private/<your_domain_name>.key;

    location / {
        root  /usr/share/nginx/html;
        index index.html index.htm;

        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  X-Forwarded-Proto $scheme;

        proxy_pass  http://<your_domain_name>:<port_where_shieldsio_listens>;
    }

    error_page  500 502 503 504  /50x.html;
    location = /50x.html {
        root  /usr/share/nginx/html;
    }
}

使用此配置,部署的 nginx 将处理 HTTPS 连接,并且内容仍将由正在运行的 shieldsio 服务器提供。

于 2021-10-14T08:57:18.050 回答