dùng SSl trong Rails

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

Tạo file config
Với rails 3 và rails 4 ta chỉ cần tạo 1 file config mới để lúc cần có thế chạy SSL theo như ước 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'] || "lập trình viênelopment").dup,                     :daemonize => false,                     :fixbugger => 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 ta sẽ chạy lệnh ./bin/sslrails s thay lệnh rails s mặc định

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, để dùng được ssl trên local ta 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 để dùng khi chạy ssl.
Trong file config/puma.rb thêm config

if "lập trình viênelopment" == ENV.fetch("RAILS_ENV") { "lập trình viênelopment" }   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, ta chạy lệnh bundle exec pumactl start thay vì rails.
Thin
Dung gem thin thì dễ làm nhất, 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.
quan tâm: Với việc dùng 2 gem ở trên, khi chạy 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 dùng WEBrick(chạy rails s), ta cần thêm một vài dòng code trong file config/environments/lập trình viênelopment.rb

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

Nguồn viblo.asia