【问题标题】:Content Security Policy: The page’s settings blocked the loading内容安全策略:页面设置阻止加载
【发布时间】:2021-02-24 21:28:50
【问题描述】:

我在本地服务器中使用 WebSocket (wss://),它可以正常工作:

  • 无效的 SSL(我使用了 kubernate 并且需要 ssl)
  • 没有反向代理 (Nginx)

但是当将此程序部署到将 nginx 配置为反向代理和有效 ssl(certbor,让我们加密)的服务器中时,我的程序无法运行,并且在 java 脚本 clent 中出现此错误,并且我在那里写了一些细节:

错误浏览器控制台:

内容安全政策:页面设置阻止加载 ws:/// 中的资源(“default-src”)。

错误指向的Java脚本代码:

var ws = new WebSocket('wss://' + location.host + '/<some-url>');

Nginx 配置:

user nginx;
worker_processes 1;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {

   include /etc/nginx/conf-enabled/*.conf;
   include /etc/nginx/sites-enabled/*.conf;


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

          server_name  www.<my-domain> <my-domain>;

          location / {
            proxy_pass       http://127.0.0.1:<my-port>/;
            proxy_redirect off;
            proxy_set_header X-NginX-Proxy true;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
          }

          ssl_certificate /etc/letsencrypt/live/<my-domain>/fullchain.pem; # managed by Certbot
          ssl_certificate_key /etc/letsencrypt/live/<my-domain>/privkey.pem; # managed by Certbot
          include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
          ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    }



}

【问题讨论】:

    标签: spring-boot ssl nginx websocket content-security-policy


    【解决方案1】:

    有2点:

    1. 生产服务器在某处发布了 CSP 标头。 Spring Security 默认不添加内容安全策略,Nginx 可以这样做,但我在其配置中看不到:add_header Content-Security-Policy "default-src 'self'";
      无论如何,检查servlet-headers-csp 是否有这样的:

    @EnableWebSecurity
    public class WebSecurityConfig extends
    WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) {
    http
    .headers(headers -&gt; headers
    .contentSecurityPolicy(csp -&gt; csp
    .policyDirectives("default-src 'self'")
    )
    );
    }
    }

    或:

    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.headers()
                .contentSecurityPolicy("default-src 'self'");
        }
    }
    

    确保'self' 存在或将ws: 添加到现有规则中。在 https: 页面上 'self' 是阴险的 - 它只允许 https: 和 wss: (不是 http: 和 ws: - 无论如何这些将作为混合内容被阻止)。在 http: 页面上,'self' 允许 https:/wss:/http:/ws:.
    最好将特定的 connect-src 'self'connect-src ws://site.com wss:site.com 指令添加到您的 CSP。
    @987654343 @如果不需要CSP,去掉相关即可:

    http.headers()
      .contentSecurityPolicy("default-src 'self'");
    
    1. In err: blocked the loading of a resource at ws:/// - ws:/// 表示new WebSocket('wss://' + location.host + '/&lt;some-url&gt;') location.host 是空的,所以 websocket 没有连接的地方。任何 CSP 都将阻止 ws:/// 源为无效。

    【讨论】:

    • 感谢您的回复,但第一个解决方案不加载我的 js 文件并给我一个错误(我不使用 wss 检查它),第二个不是我的意思,location.host 是
    • 第一个解决方案 - 是找到您的服务器发布 CSP 标头的位置。如果您不熟悉 CSP 或不需要它 - 只需将其关闭即可。如果您只添加第二个 CSP 标头 - 是的,它会破坏 JS/CSS。
    • 如何禁用 CSP?这是在服务器端吗?
    • CSP 可以通过 2 种方式发布:通过 HTTP 标头(始终是服务器端);通过元标记&lt;meta http-equiv=Content-Security-Policy content="CSP rules here"&gt;(通常是服务器端,但作为任何元标记,它可以由客户端的脚本设置)。在答案的第 1 段中,我展示了在 Spring congif 中在服务器端搜索的代码示例。在 Nginx 配置中,它可能类似于 add_header Content-Security-Policy "default-src 'self' 'unsafe-inline'"。您没有为 CSP 使用元标记,因为在 Dev 上您没有遇到问题。因此 - 服务器端。
    • 谢谢。因此我在客户端添加: 到包含 wss:// js 文件(高于 wss://)的页面并添加标题“Content-安全策略 "default-src 'self'";"用于服务器端?
    猜你喜欢
    • 2016-09-14
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多