Rails

Macの開発時にオレオレ証明書を作ってPumaで接続するよ!

More than 1 year has passed since last update.

はじめに

AWSのCloudFrontを使っている時に、アクセスするファイルのドメインの問題を解消したくなりました(xxx.cloudfront.netという名前のホストにCookie有効でアクセスしたいのです)。本番同様にローカル開発環境からSSLでアクセスして、AWSの環境にアクセスさせる環境をつくろうと思い立ちましたが、結構難儀したのでまとめておきたいと思います。

以前はごまかせたのに、昨今のブラウザがちゃんと証明書を作らないと表示すらさせてくれない(つれぇよ。設定でホワイトリストさせておくれよ)ので、こんな遠回りなことになっている気がします。

手順

Hostsの設定をする

https://qiita.com/abdonwww/items/903431d1dad743dc9c69
こちらを参考にすると、local.xxx.cloudfront.netのような名前で自ローカルサーバーへアクセスできるようにすることが必要そうです。

というわけでHostsを設定します。

/etc/hosts
127.0.0.1   local.xxx.cloudfront.net

オレオレ証明書を作る

https://qiita.com/pikanji/items/a09e906f7099f7eed392
こちらがとっても鮮やかでした!惚れてまうやろ!(古い)

とっても丁寧に書かれているので、こちらを参考にやると良いと思います。

私の場合には下記のように.envを修正しました。

DOMAIN=xxx.cloudfront.net
COMMON_NAME=local.xxx.cloudfront.net

プロジェクト外でファイルを作って下記のようにしました。他の人が試す時にはこれらのファイルで接続してもらえればわざわざ証明書を作ってもらわなくて済むようになりますよね(多分)。server.crtxxx.cloudfront.net.crt という名前で作られているものをリネームしています。同様にserver.p12xxx.cloudfront.net.p12 からリネームしました。

  • /lib/supports/ssl/server.key
  • /lib/supports/ssl/server.crt
  • /lib/supports/ssl/server.p12
  • /lib/supports/ssl/root_ca.crt

Pumaに設定する

https://qiita.com/zaru/items/ccf328e87c768168134d
ssl_bind という機能でやるんですね。

私が間違えてしまったのは 9292の部分を自分が立ち上げているサーバーのポート(ENV.fetch("PORT") { 3000 }) にすると読み違えてしまったことです。ここはwellknownポートにしたいはずなので、 443で良いです。以下のように書けば良さげですね。

/config/puma.rb
if "development" == ENV.fetch("RAILS_ENV") { "development" }
  ssl_bind '0.0.0.0', 443, {
    key:  Rails.root.join('lib', 'supports', 'ssl', 'server.key'),
    cert: Rails.root.join('lib', 'supports', 'ssl', 'server.crt'),
    ca:  Rails.root.join('lib', 'supports', 'ssl', 'root_ca.crt'),
    verify_mode: "none"
  }
end

サーバーを起動する

sudo してね!

$ sudo bin/rails s
Password:
=> Booting Puma
=> Rails 5.1.4 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.10.0 (ruby 2.4.1-p111), codename: Russell's Teapot
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
* Listening on ssl://0.0.0.0:443?cert=/path/to/project/lib/supports/ssl/server.crt&key=/path/to/project/lib/supports/ssl/server.key&verify_mode=none
Use Ctrl-C to stop

アクセスすると下記のようなエラー表示が出るかもしれない。原因不明です。実害はなさそう。

2017-09-27 03:42:15 +0900: SSL error, peer: 127.0.0.1, peer cert: , #<Puma::MiniSSL::SSLError: System error: Undefined error: 0 - 0>

おしまいに

些細なところでも気づかないとかなり時間を食ってしまうのがこの手の作業の辛いところでした。