オレオレ証明書を使ってwebrickを起動する
railsでdevelopment環境でオレオレ証明書を使いたい場合のメモ。 thinを使っている場合が多いみたいだけど、webrickでも出来ないこともない。
このページのコードに従っていけばちゃんと動いた。
環境
rails 4.2.2 ruby 2.1.4p265
STEP1. オレオレ証明書の作成
openssl req -new -newkey rsa:2048 -sha1 -days 365 -nodes -x509 -keyout localhost.key -out localhost.crt
このコマンドでオレオレ証明書用の秘密鍵とサーバ証明書を作成。 opensslのオプションやオレオレ証明書の仕組みなどについては以下を参考にした。
STEP2. 証明書をwebrickに読み込ませる
以下のファイルを何処か適当に置く。元リンクではRAILS_ROOT/config/ssl.rbとしておいてるのでそれに従っておく。
if ENV['SSL'] == 'true' require 'rubygems' require 'rails/commands/server' require 'rack' require 'webrick' require 'webrick/https' module Rails class Server < ::Rack::Server def default_options super.merge({ SSLEnable: true, SSLVerifyClient: OpenSSL::SSL::VERIFY_NONE, SSLPrivateKey: OpenSSL::PKey::RSA.new(File.open("/path/to/localhost.key").read), SSLCertificate: OpenSSL::X509::Certificate.new(File.open("/path/to/localhost.crt").read), SSLCertName: [["CN", WEBrick::Utils::getservername]], }) end end end end
STEP3. config/ssl.rbを読み込む
bin/rails.rbを変更する。具体的にはconfig/ssl.rbを読み込ませるだけ。 コメントで囲まれている部分が追加部分。
#!/usr/bin/env ruby #------- added by carwow -------- require_relative '../config/ssl' #-------------------------------- begin load File.expand_path("../spring", __FILE__) rescue LoadError end APP_PATH = File.expand_path('../../config/application', __FILE__) require_relative '../config/boot' require 'rails/commands'
STEP4. webrickの起動
config/ssl.rbでif ENV['SSL'] == 'true' という分岐があるのでそれの通りにENVを入れたうえでrails serverすればいい
SSL=true rails s
問題点
1. Rails.env == "development" で分岐できない
わざわざwebrickを起動する時にSSL=trueとかそういう分岐を入れるのも嫌なのでRails.env == "development"のときだけconfig/ssl.rbを読み込めないかと試してみたけど、無理っぽかった。出来るのかもしれないけどそこまで調べるほどのものでもないかとおもってこのままにしている。
そもそもステージングや本番環境なら多くはnginxなどのwebサーバを前段に置いて、アプリケーションサーバはunicornとかpuma使うという構成になると思う。webrickの出番は開発環境でしかないことが多い。ので、まぁそこはそんなに気にしなくてもいいかなと思う。
2. bin/railsを書き換えなきゃいけない
ここが一番嫌。config/initializer/の中でなんとか出来ないかと思っていたけど、そこに来る時点でもうwebrickは立ち上がってるので無理。bin/rails変えるといろいろ面倒事が起こりそうな予感がしないでもないので、できるだけここには手を突っ込みたくなかったけど、他にやる方法がわからなかった。