Trong qua trình phát một ứng dụng với rails, theo yêu cầu của ứng dụng, nhiều lúc chúng ta thường phải sử dụng https thay vì sử dụng http mặc định của rails trên môi trường development ví dụ như phát triển 1 extension với API là ruby on rails(các địa chỉ web trong extension bắt buộc sư dụng https). Do vậy, trong phần này chúng ta sẽ tìm hiểu cách config để có thể sử dụng https với Rails.

  • Tạo file config
    Với rails 3 và rails 4 chúng ta chỉ cần tạo 1 file config mới để lúc cần có thế chạy SSL theo như mong muốn và vẫn có thể nhìn log trên màn hình console như lúc chạy rails s bình thường.
    Ở đây, file config được đặt tên là sslrail.rb và được đặt trong thư mục bin.
APP_PATH = File.expand_path('../../config/application',  __FILE__)
require File.expand_path('../../config/boot',  __FILE__)
require 'rails/commands'
require 'rubygems'
require 'rails/commands/server'
require 'rack'
require 'webrick'
require 'webrick/https'
require 'webrick/ssl'
# bin/sslrails
module Rails
  class Server < ::Rack::Server
    def default_options
      cn = [['CN', WEBrick::Utils::getservername]]
      comment = 'Run Ruby/OpenSSL'
      cert, rsa = WEBrick::Utils::create_self_signed_cert(2048, cn, comment)
      ssl_certificate = cert.to_s
      ssl_private_key = rsa.to_s

      super.merge({
                    :Port => 3000,
                    :environment => (ENV['RAILS_ENV'] || "development").dup,
                    :daemonize => false,
                    :debugger => false,
                    :pid => File.expand_path("tmp/pids/server.pid"),
                    :config => File.expand_path("config.ru"),
                    :SSLEnable => true,
                    :SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE,
                    :SSLPrivateKey => OpenSSL::PKey::RSA.new(ssl_private_key),
                    :SSLCertificate => OpenSSL::X509::Certificate.new(ssl_certificate),
                    :SSLCertName => cn
                  })
    end
  end
end

khi chạy chúng ta sẽ chạy lệnh ./bin/sslrails s thay lệnh rails s mặc định

  • Sử dụng gem:
    Có 2 loại gem chính dùng để chạy ssl trên rails, đó là gem pumagem thin. Với rails 5, để sử dụng được ssl trên local chúng ta sẽ sử dụng gem, thay vì tạo file config.
    Puma
    Thêm dòng gem puma trong Gemfile, và chạy lênh
$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt

để tạo ra file server.key và server.csr để sử dụng khi chạy ssl.
Trong file config/puma.rb thêm config

if "development" == ENV.fetch("RAILS_ENV") { "development" }
  ssl_bind '0.0.0.0', '3000', {
    key: "/file_path/server.key",
    cert: "/file_path/server.crt",
    verify_mode: "none"
  }
end

và để khởi động server, chúng ta chạy lệnh bundle exec pumactl start thay vì rails.
Thin
Dung gem thin thì đơn giản nhất, chúng ta chỉ cần thêm gem thin vào trong file Gemfile và chạy lệnh
thin start --ssl
để khởi động server.
Lưu ý: Với việc sử dụng 2 gem ở trên, khi chạy chúng ta sẽ không thấy log của server trên màn hình console.
Do đó, để nhìn thấy log bình thường như khi sử dụng WEBrick(chạy rails s), chúng ta cần thêm một số dòng code trong file config/environments/development.rb

  logger           = ActiveSupport::Logger.new(STDOUT)
  logger.formatter = config.log_formatter
 config.logger    = ActiveSupport::TaggedLogging.new(logger)