使用 Docker 时如何将 STS headers 与 Traefik 一起使用

How to use STS headers with Traefik when using Docker

这是我困扰了好几天的问题,但我在 Whosebug 上找不到任何帮助,甚至连帮助都没有。希望以后能帮到有类似问题的人。非常欢迎对此 question/answer 进行任何详细说明。

在使用 Traefik 作为代理时,我一直在尝试将 STS-headers 设置为 http-requests Docker环境。不知何故,无论我如何尝试设置 headers,我的浏览器 (Google Chrome) 都会忽略它们。我做错了什么?

我在 Traefik 中与 HSTS headers 斗争了好几天,当我学到一些关于 HSTS 的重要知识时:

当您使用的证书被您的浏览器认为不是 trustworthy/safe 时,您的浏览器将忽略任何 STS headers。您可以使用开发人员工具中的安全选项卡验证这一点(在 Chrome 中)。

要使 HSTS(HTTP 严格传输安全)正常工作,我必须在我的特定场景中解决接下来的几件事:

  • 我用于开发的证书是 self-signed 并安装到我的机器上。但是因为它是self-signed,所以没有放在“Trusted Root Certification Authorities”目录中。我的浏览器抱怨它在那个目录中找不到我的证书,所以我不得不把它放在那里,否则浏览器仍然认为证书不安全。 请注意,这只是为了开发目的,官方证书正在路上。

  • 起初我创建了我的证书,将我的域放在 CN(通用名称)部分。如今,浏览器有点忽略该部分并寻找 SAN(主题备用名称)。我必须在那个部分用我的域创建一个新证书。

这两件事是我错过的,在解决这些问题后,我的 STS headers(用于 docker-compose 服务标签)正在运行。标签 (Traefik v1.7) 如下所示:

my_service:
    deploy:
      labels:
      - "traefik.frontend.headers.STSPreload=true"
      - "traefik.frontend.headers.STSSeconds=31536000"

希望对大家有所帮助。

对于 Traefik v2,标签如下所示:

    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.service.rule=Host(`service.com`)"
      - "traefik.http.middlewares.servicests.headers.stsincludesubdomains=false"
      - "traefik.http.middlewares.servicests.headers.stspreload=true"
      - "traefik.http.middlewares.servicests.headers.stsseconds=31536000"
      - "traefik.http.middlewares.servicests.headers.isdevelopment=false"
      - "traefik.http.routers.service.middlewares=servicests"

我建议您将 service 一词替换为您的服务名称。