tumblr

tumblr(タンブラー)は、メディアミックスブログサービス。ブログとミニブログ、そしてソーシャルブックマークを統合したマイクロブログサービスである。アメリカのDavidville.inc(現: Tumblr, Inc.)により2007年3月1日にサービスが開始された。

オレオレ証明書を使ってwebrickを起動する

railsでdevelopment環境でオレオレ証明書を使いたい場合のメモ。 thinを使っている場合が多いみたいだけど、webrickでも出来ないこともない。

underthehood.carwow.co.uk

このページのコードに従っていけばちゃんと動いた。

環境

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のオプションやオレオレ証明書の仕組みなどについては以下を参考にした。

d.hatena.ne.jp

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変えるといろいろ面倒事が起こりそうな予感がしないでもないので、できるだけここには手を突っ込みたくなかったけど、他にやる方法がわからなかった。