Webセキュリティの小部屋

Twitter のフォローはこちらから Facebook ページはこちら RSSフィードのご登録はこちらから
公開日:2017年5月4日
最終更新日:2017年5月5日

Let's EncryptでSSL/TLS証明書のRSA鍵長を4096ビットにする方法

マストドンのインスタンス用に Let’s Encrypt の SSL/TLS 証明書を取得しました。なので 通常は Nginx になりますが、HTTPS の評価を高めるために Nginx の設定変更と Let’s Encrypt の SSL/TLS 証明書の RSA 鍵長を4096ビットにしてみます。

以下のように Certbot にオプションをつけることによってRSA鍵長を4096ビットにすることができます。

certbot renew --rsa-key-size 4096

強制的に証明書を取得したい場合は、以下のように指定します。
certbot renew --force-renewal --rsa-key-size 4096

これで Nginx を先起動すると無事に RSA鍵長の4096ビットの SSL/TLS証明書を取得することができます。

以下のような Nginx の設定(/etc/nginx/conf.d/mastodon.conf)を行うことで、SSL Labs の SSL Server Test で A+ を取得できました。対応前は Key Exchange で問題がありましたが解消されています。

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

server {
  listen 80;
  listen [::]:80;
  server_name example.com;
  # Useful for Let's Encrypt
  location /.well-known/acme-challenge/ { allow all; }
  location / { return 301 https://$host$request_uri; }
}

server {
  listen 443 ssl;
  listen [::]:443 ssl;
  server_name example.com;

  ssl_protocols TLSv1.2;
  ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
  ssl_stapling on;
  ssl_stapling_verify on;

  ssl_ecdh_curve secp384r1;

  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;

  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  ssl_dhparam         /etc/nginx/conf.d/ssl/dhparam.pem;

  keepalive_timeout    70;
  sendfile             on;
  client_max_body_size 0;

  root /home/mastodon/live/public;

  gzip on;
  gzip_disable "msie6";
  gzip_vary on;
  gzip_proxied any;
  gzip_comp_level 6;
  gzip_buffers 16 8k;
  gzip_http_version 1.1;
  gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

  add_header Strict-Transport-Security "max-age=31536000";
  add_header Referrer-Policy "unsafe-url";
  add_header Content-Security-Policy "frame-ancestors 'none'; object-src 'none'; script-src 'self'; base-uri 'none'";

  location / {
    try_files $uri @proxy;
  }

  location /assets {
    add_header Cache-Control "public, max-age=31536000, immutable";
  }

  location @proxy {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Proxy "";
    proxy_pass_header Server;

    proxy_pass http://127.0.0.1:3000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
  }

  location /api/v1/streaming {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Proxy "";

    proxy_pass http://127.0.0.1:4000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;
  }

  error_page 500 501 502 503 504 /500.html;
}

Rsa03

なお、mastodon.conf の ssl_dhparam の行は、以下のコマンドをパスを合わせ実行してファイルを作成しておく必要があります。

mkdir /etc/nginx/conf.d/ssl
cd /etc/nginx/conf.d/ssl
openssl dhparam 4096 -out dhparam.pem

これで、マストドンのインスタンス一覧で HTTPS の評価が Aになりました。A+ には到達できませんでしたが、下位互換を考えるとちょっと難しいと思いますので、これでよしとしようと思います。

Rsa02

また、Obs という評価項目もありますが、これは Mozilla の Observatory というセキュリティ診断サービスです。

マストドンのでデフォルトサンプルの設定だと B+ になるのですが、Content Security Policy (CSP)をサンプルに追記することで A+ になります。上記の mastodon.conf には設定済みですね。

マストドンのインスタンスを立ち上げるのはいいのですが、セキュリティには配慮してもらえればと思います。サーバーのセキュリティ設定については CentOS ですが以下の記事を参考にしてください。

■参考


スポンサーリンク





カテゴリー:ブログ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA