Docker・Rails・pumaのローカル環境でSSL化


Docker・Rails・pumaの本番環境でSSL通信でCRUDの一部が上手くできないので、ローカルで色々試すめにローカル環境をSSL化しました。
その時の手順をまとめました。

前提

  • 既にhttp接続でページが表示できている状態
  • 証明書作成にopensslを使用
  • Chromeはセキュリティで、接続できないのでfirefoxでアクセスし表示・動作の検証を行う
  • ページアクセス時、通信は安全ではないというメッセージが返ってくるが、「詳細情報」→「危険性を承知で続行」で表示できる

実装手順

# 証明書設置ディレクトリに移動
$ cd docker/nginx/ssl

$ openssl genrsa -out server.key 2048

# 登録情報は適当にしてます。。。
$ openssl req -new -key server.key -out server.csr
Country Name (2 letter code) []:JP
State or Province Name (full name) []:Fukuoka prefecture
Locality Name (eg, city) []:Fukuoka city
Organization Name (eg, company) []:oreore
Organizational Unit Name (eg, section) []:oreore
Common Name (eg, fully qualified host name) []:localhost
Email Address []:[email protected]
A challenge password []:a123456

$ openssl x509 -days 3650 -req -signkey server.key -in server.csr -out server.crt

GitHubにアップロードされるないようにする

.gitignore

/docker/nginx/ssl/server.crt
/docker/nginx/ssl/server.csr
/docker/nginx/ssl/server.key

443ポートできるようにしたり、証明書のあるパスにマウントをあわせる。

docker-compose.yml

nginx:
    build:
      context: .
      dockerfile: ./docker/nginx/Dockerfile
    ports:
      - '80:80'
      - '443:443' #追加
    volumes:
      - sockets:/app/tmp/sockets
      - ./docker/nginx/ssl:/etc/nginx/ssl #追加

「ssl_certificate」などに証明書があるディレクトリパスをセットする。
httpにアクセスするとhttpsに301リダイレクトされるようにする。

docker/nginx/default.conf

upstream app {
  server unix:///app/tmp/sockets/puma.sock;
}

server {
  listen 80;
  server_name  _;
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl;
  server_name localhost;

  ssl_certificate     /etc/nginx/ssl/server.crt;
  ssl_certificate_key /etc/nginx/ssl/server.key;
  ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers         HIGH:!aNULL:!MD5;

# ・・・省略
$ docker-compose up -d

参考

pumaサーバーをSSLでアクセス可能にする方法 - ryotaku's Tech Blog
Railsの開発環境でHTTPSを有効にする
Rails + Pumaの開発環境をSSL化 - Qiita
Rails5 + pumaのローカル環境でSSL/HTTPSを有効にする - Qiita
NginxでSSL(HTTPS)設定!オレオレ(自己署名)証明書を作成しよう!

さいごに

肝心のローカルhttps接続下で、CRUDは出来たので、この本番環境用の証明書に置き換えてもう一度検証してみようと思います。