Win Server 2019 RDS HTML 5 Web 客户端无法在 nginx Web 代理后面运行

Win Server 2019 RDS HTML 5 Web 客户端无法在 nginx Web 代理后面运行

我们的环境要求我们的 Windows Server 2019 RDS 网关(安装了 HTML 5 Web 客户端)位于 nginx Web 代理后面。网站部分运行良好,但在尝试连接 HTML 5 Web 客户端中的 RDS 终端会话应用程序时,连接断开。使用 RDS 客户端就可以了。

这是我们的设置:

  • Server 2019 RDS 网关是 gateway.corp.domain.com
  • RDS 网关配置为使用 remote.domain.com 作为公共地址
  • remote.domain.com 指向 nginx Web 服务器
  • nginx Web 服务器(使用正确的 Web 套接字标头)将流量传递到 RDS 网关(gateway.corp.domain.com)和从 RDS 网关(gateway.corp.domain.com)传递流量

在客户端,我们在网络浏览器中收到错误:

The connection to the remote PC was lost

在 Web 检查器控制台中,我们看到有关无法建立 Web 套接字连接的错误:

Gateway channel creation failed with error code=2147965402

Could not connect to wss://remote.domain.com/remotedesktopgateway/...

是否有人知道我们可以做些什么来解决这个问题,以便我们可以通过 Web 客户端访问我们的 RDS 应用程序?

我似乎找不到任何关于此的文档来了解 HTML 5 Web 客户端服务器到底需要什么。不幸的是,删除反向 Web 代理不是一个选项。

答案1

我在修复另一个问题时最终找到了答案:该问题是由 nginx 反向代理添加的过于严格的 Content-Security-Policy 标头引起的。

之前,标头只有 default-src;现在它有 image-src 和 media-src,以允许 data: 和 blob: 数据类型。这是当前正在运行的标头(可能过于宽松,但在我们进一步审查之前它是有效的):

default-src * data: 'unsafe-eval' 'unsafe-inline'; img-src * data: blob:; media-src * data: blob:


编辑

以下是相关的 nginx 配置(以及其他所有内容):

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;

  server_name remote.example.com;

  # SSL
  ssl_certificate /path/to/ssl/fullchain.pem;
  ssl_certificate_key /path/to/ssl/privkey.pem;
  ssl_trusted_certificate /path/to/ssl/chain.pem;

  # reverse proxy
  location / {
    ### IP address is permissible here
    proxy_pass      https://gateway.corp.domain.com:443/;
    include         conf.d/proxy.part;
  }

  # security headers
  add_header X-Frame-Options "SAMEORIGIN" always;
  add_header X-XSS-Protection "1; mode=block;" always;
  add_header X-Content-Type-Options "nosniff" always;
  add_header Referrer-Policy "no-referrer-when-downgrade" always;

  ### This is the header referenced above ###
  add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'; img-src * data: blob:; media-src * data: blob:" always;

  add_header X-Robots-Tag none;
  add_header X-Download-Options noopen;
  add_header X-Permitted-Cross-Domain-Policies none;

  ### Be careful with this header; this will cause your site to break if it ever stops serving over TLS
  add_header Strict-Transport-Security "max-age=15552000; includeSubDomains";

  # . files
  location ~ /\. {
    deny all;
  }

  # gzip
  gzip on;
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;
}

我还在 RDS 服务器上添加了一个 IIS 重写规则,以自动重写到 Web 客户端的路径(remote.example.com例如remote.example.com/rdweb/webclient,尽管这也可以在 nginx 中完成。

相关内容