LoginSignup
1
0

More than 5 years have passed since last update.

WEBrick と rack-reverse-proxy でサクっと https リバースプロキシ

Last updated at Posted at 2016-04-28

こちらの記事を参考に
http://qiita.com/hiroshi3110/items/af7b6c4f7824539d7a53

WEBrick でやってみる

webrick_https_reverse_proxy.ru
require 'rack/reverse_proxy'

# monkey patching
module AddXForwardedProtoHeader
    def set_forwarded_headers
        super
        return unless options[:x_forwarded_headers]
        target_request_headers["X-Forwarded-Proto"] = source_request.scheme
    end
end
RackReverseProxy::RoundTrip.prepend AddXForwardedProtoHeader

require 'rack/builder'
app = Rack::Builder.new {
    target = ENV["TO"] || "http://localhost:9292"
    use Rack::ReverseProxy do
        reverse_proxy '/', target
    end

    run Proc.new {}
}

require 'webrick'
# これが無いと curl: (35) Unknown SSL protocol error in connection to とかになる
require 'webrick/https'

# その場でオレオレ証明書を作成
# :SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE を指定してるので要らないけど。
cn = [[ "CN", WEBrick::Utils::getservername]]
comment = "Generated by Ruby/OpenSSL"
cert, rsa = WEBrick::Utils::create_self_signed_cert(2048, cn, comment)

require 'rack/handler/webrick'
Rack::Handler::WEBrick.run app, {
    :Port => 443,
    :BindAddress => "0.0.0.0",
    :SSLEnable => true,
    :SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE,
    :SSLPrivateKey => OpenSSL::PKey::RSA.new(rsa.to_s),
    :SSLCertificate => OpenSSL::X509::Certificate.new(cert.to_s),
    :SSLCertName => cn
}

思ったほどサクっとしてなかった。

起動
sudo rackup webrick_https_reverse_proxy.ru

余談

rack/reverse_proxy の gem が X-Forwarded-Proto のヘッダ付けてくれないので、とりあえずモンキーパッチで対応。
追加してプルリク送っといた。

追記

毎回証明書作りなおすと起動するたびにブラウザに注意されるので、
一度オレオレ証明書作ってそれを使ったほうが良さげな感じ。

参考:http://d.hatena.ne.jp/ozuma/20130511/1368284304

snip
    webrick_opt = {
        :Port => 443,
        :BindAddress => "0.0.0.0",
        :SSLEnable => true,
        :SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE,
        :SSLPrivateKey => OpenSSL::PKey::RSA.new(File.open(File.dirname(__FILE__) + "/server.key")),
        :SSLCertificate => OpenSSL::X509::Certificate.new(File.open(File.dirname(__FILE__) + "/server.crt")),
    }
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0