我们的环境要求我们的 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 中完成。