Ruby
Sinatra
HTTPS
WEBRick
自己証明書

Sinatraでローカル環境のWEBrickをHTTPSで動かす

TL;DR

  • Sinatra + WEBrick + HTTPS
  • WEBrickは起動時のオプションで下記を指定すればよい
    • SSLEnable: true
    • SSLCertificate: [['CN', WEBrick::Utils.getservername]]1
  • SinatraからWEBrick起動時のオプションを渡すにはset :server_settingsを使う

環境

  • Windows10
    • ruby 2.4.1p111 (2017-03-22 revision 58053) [x64-mingw32]
    • sinatra 1.4.8
  • OSX
    • ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
    • sinatra 2.0.0

なお、Sinatraはクラシックスタイルでの利用

鍵の作成

下記を参考に作成。
Creating a Self-Signed SSL Certificate | Heroku Dev Center
ただ、最終的にWEBrickで自動作成するなら不要。

Sinatraでのサーバへの設定

sinatra/base.rb#L1452
つまり

set :server_settings, options

とすればいいので下記の感じに。

if settings.development?
  require 'webrick/https'
  require 'openssl'
  ssl_options = {
    SSLEnable: true,
    SSLCertificate: OpenSSL::X509::Certificate.new(File.open('./server.crt').read),
    SSLPrivateKey:  OpenSSL::PKey::RSA.new(File.open('./server.key').read)
  }
  set :server_settings, ssl_options
end
  • server.crtserver.keyは起動前に所定の場所に配置する
    • ただし、WEBrickで自動作成するなら不要
  • if settings.development?は本番では必要ないための分岐

WEBrickで証明書を自動作成するようにする

  • Sinatra(WEBrick)でsslサーバをたてる
    • 初期起動時に鍵を自動生成するという点の参考にさせて頂く
    • WEBrick::Utils::create_self_signed_certってのがあることに気がつく
    • WEBrickのソースを眺めてみることにした
  • https://github.com/ruby/ruby/blob/ruby_2_4/lib/webrick.rb#L88-L121
    • 普通にHTTPSの場合について書いてあった
    • SSLEnabletrueにして
    • SSLCertName[['CN', WEBrick::Utils.getservername]]とかにする
    • 起動のたびに証明書が再作成される
    • 事前作成したものを使用する場合あ先述の方法でOK
  • Sinatra + WEBrick + HTTPS
    • 以上をもとに必要最低限のコードを書いてみた

  1. webrick.rb記載のように[%w[CN localhost]]でもいい。