Sử dụng SSl trong Rails
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). ...
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 puma và gem 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)