Edited at

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

More than 1 year has passed since last update.


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]]でもいい。