Sử dụng SSl trong Rails
Bài đăng này đã không được cập nhật trong 7 năm
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ònggem 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)
All rights reserved