为 Docker 安装的 Discourse 增加 SSL 支持

所以您想要启用 SSL 支持?让我们开始吧!

这篇指南假设您已经使用了默认标准安装——单个配置文件,位于 var/discourse/containers/app.yml和 Discourse docker 被安装在:/var/discourse

购买 SSL 证书

去 namecheap 或其他 SSL 证书提供商那,为您的域名购买 SSL 证书。按照他们提供的教程生成私钥和 CSR,再最后得到您的证书。我默认使用 apache,他们工作正常。

在安全的地方保存私钥和证书。

放置证书和密钥

获得签名的证书和私钥并将其放置在 /var/discourse/shared/standalone/ssl/ 文件夹

私钥命名为:

/var/discourse/shared/standalone/ssl/ssl.key

证书命名为:

/var/discourse/shared/standalone/ssl/ssl.crt

文件名非常重要,不要随意更改,否则 nginx 模板将不会知道去哪儿找到证书。

看一看 app.yml 配置文件,看看 shared 目录挂载在哪。

volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared

文件必须在容器中的 /shared/ssl/ssl.key 和 /shared/ssl/ssl.crt。

配置 NGINX

在您 app.yml 配置文件中加入引用 nginx ssl 模板的语句:

templates:
  - "templates/cron.template.yml"
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/sshd.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ssl.template.yml"

配置您的 Docker 容器

通知你的容器监听 SSL

expose:
  - "80:80"
  - "2222:22"
  - "443:443"

初始化您的 Docker 容器

重建您的应用

./launcher rebuild app

就这样,搞定了!

排错

请先阅读一次日志,

./launcher logs app

看看什么出错了。

它是如何工作的

使用的模板大致基于 @igrigorik 推荐的模板,除了:

  • 我跳过了 OSCP stapling,因为它让安装变得更复杂了一点点
  • 在我们使用主线前我不得不跳过会话记录设置

镜像有重写规则,会将任何至 80 或 443 的请求定向至 https://DISCOURSE_HOST_NAME,意味着您不需为多个域名设置证书,而只需设置一个。

自定义安装它非常简单,见:
github.com
https://github.com/discourse/discourse_docker/blob/master/templates/web.ssl.template.yml

run:
  - replace:
     filename: "/etc/nginx/conf.d/discourse.conf"
     from: /server.+{/
     to: |
       server {
         listen 80;
         rewrite ^ https://$$ENV_DISCOURSE_HOSTNAME$request_uri? permanent;
       }
       server {
  - replace:
     filename: "/etc/nginx/conf.d/discourse.conf"
     from: /listen 80;\s+gzip on;/m
     to: |
       listen 443 ssl spdy;
       spdy_keepalive_timeout 300; # up from 180 secs default
       ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
       # courtesy of https://wiki.mozilla.org/Security/Server_Side_TLS#Recommended_Ciphersuite
       ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:AES128:AES256:RC4-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK;
       ssl_prefer_server_ciphers on;

您可以拷贝一份文件并根据需要扩展模板。

使用此模板的意义在于我们会持续更新 Discourse 默认安装的 NGINX。

测试您的配置
https://www.ssllabs.com/ssltest/24 确保一切工作正常。有些浏览器和操作系统可能会接受部分配置的 https,但还是先检查看看吧。

还没有评论,快来抢沙发!

发表评论

  • 😉
  • 😐
  • 😡
  • 😈
  • 🙂
  • 😯
  • 🙁
  • 🙄
  • 😛
  • 😳
  • 😮
  • emoji-mrgree
  • 😆
  • 💡
  • 😀
  • 👿
  • 😥
  • 😎
  • ➡
  • 😕
  • ❓
  • ❗
  • 66 queries in 0.452 seconds