添加 "IncludeSubdomain" 到 STS 标头的受支持方式

大家好,

对于我们当前的自托管 Discourse 实例,我们需要在 STS 标头中添加“IncludeSubDomains”,因为这是我们内部扫描仪的要求。

以前,我通过在构建后的 app.yml 的自定义命令中使用 sed 命令来实现此目的,以更新 /etc/nginx/conf.d/discourse.conf 以包含 'add_header Strict-Transport-Security “max-age=31536000; includeSubDomains” always;

以及:

 - replace:
      filename: "/etc/nginx/conf.d/outlets/discourse/20-https.conf"
      from: /add_header Strict-Transport-Security.+/
      to: add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
      global: true

  - replace:
      filename: "/etc/nginx/conf.d/outlets/server/20-https.conf"
      from: /add_header Strict-Transport-Security.+/
      to: add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
      global: true

这以前是有效的。但是,它现在停止工作了。我读到创建一个新的 outlet 文件应该允许我使用以下方法添加此内容:

hooks:
  after_code:
    - file:
        path: /etc/nginx/conf.d/outlets/server/90-hsts.conf
        chmod: 444
        contents: |
          add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

然而,这导致存在两个 STS 标头(一个来自 SSL 模板,一个来自我的新模板)。是否有更好的方法可以避免出现两个 STS 标头?我原以为 nginx 会尊重最后添加的标头,并忽略仅包含 max-age=31536000; 的 SSL 模板标头,所以这是个缺陷吗?感谢您提供的任何指导。

使用 set_header 而不是 add_header 能解决问题吗?

1 个赞

我试试看,然后回来报告 :slight_smile:

如果我使用 set_header,在重新构建时会收到 SSL 错误,证书未被识别,并且在尝试加载论坛页面时出现“连接被拒绝”的消息。

一些进一步的信息,我们使用我们自己的 SSL 证书。

这两个错误是互斥的……

抱歉,nginx 没有 set_header ——我记错了,它来自另一个工具。

最简单的选择可能是编辑 templates/web.ssl.template.yml 并填入你想要的新值。

1 个赞

我会首先这样做,因为它最简单。一旦你弄明白了,下一个最简单的事情就是将该文件复制到别处,这样你就不会因为 git 与它发生冲突而遇到问题。最好的解决方案是将你当前的策略与另一行结合起来,以删除其他冲突的设置。

1 个赞

感谢你们二位的帮助!

1 个赞