Thiết lập SSL ở localhost với puma

Why puma?

Khi khởi tạo một ứng dụng Ruby không sử dụng Procfile, một webserver mặc định sẽ được sử dụng. Đối với Rack, câu lệnh $ bundle exec rackup được chạy khi khởi động Rails $ rails server . WEBrick được cài đặt đi kèm với thư viện chuẩn của Ruby vì vậy nó rất tiện lợi và phổ biến. Trong môi trường development, WEBrick đáp ứng đầy đủ cho lập trình viên. Tuy nhiên, WEBrick không hỗ trợ concurrent connection vì thế nó không thích hợp trong môi trường production. Vì vậy Puma được ra đời nhằm khắc phục vấn đề về concurrency. Mặc dù Puma là một thư viện nhỏ nhưng hiệu năng của nó được đánh giá rất cao. Với những lợi ích của Puma, Rails đã sử dụng Puma làm webserver mặc định.

puma bencmark

Cách đơn giản nhất để kiểm tra webserver của rails là quan sát thông tin khởi động webserver của rails ($ rails server) Ví dụ:

~/Documents/rails_app/PumaSSL$ rails s
=> Booting Puma # Puma đang được khởi động trong ứng dụng của bạn.
=> Rails 5.1.4 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.10.0 (ruby 2.4.1-p111), codename: Russell's Teapot
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop

Giả lập SSL với Puma webserver

SSL là viết tắt của từ Secure Sockets Layer. Đây là một tiêu chuẩn an ninh công nghệ toàn cầu tạo ra một liên kết giữa máy chủ web và trình duyệt. Liên kết này đảm bảo tất cả dữ liệu trao đổi giữa máy chủ web và trình duyệt luôn được bảo mật và an toàn. SSL đảm bảo rằng tất cả các dữ liệu được truyền giữa các máy chủ web và các trình duyệt được mang tính riêng tư, tách rời. SSL là một chuẩn công nghệ được sử dụng bởi hàng triệu trang web trong việc bảo vệ các giao dịch trực tuyến với khách hàng của họ. Để đảm bảo tính bảo mật cho người dùng, các trình duyệt hiện nay có sự sàng lọc nhất định đối với các function được sử dụng ví dụ như chrome block function getUserMedia() với những kết nối không an toàn (non-SSL)... Vậy khi phát triển ứng dụng web, chúng ta phải giả lập hoặc tạo một chứng chỉ SSL để phát triển ứng dụng. Sau đây là các bước generate một SSL certificate với puma webserver trên macOS hoặc linux:

1. Tạo private key

bạn không cần quan tâm đến password ở bước này, chúng ta sẽ remove password bạn điền vào bước sau

$ cd ~/.ssh
$ openssl genrsa -des3 -out server.orig.key 2048

2. Xóa password của private key

$ openssl rsa -in server.orig.key -out server.key

3. Generate csr (Certificate signing request)

Note: Common Name phải bắt buộclocalhost.ssl ; các trường thông tin khác bạn có thể bỏ qua.

$ openssl req -new -key server.key -out server.csr

4. Generate SSL certificate

$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

5. Thêm localhost.ssl vào file hosts

$ echo "127.0.0.1 localhost.ssl" | sudo tee -a /private/etc/hosts

6. Khởi động rails server với self-signed SSL

rails server -b 'ssl://127.0.0.1:3000?key=/Users/tadas/.ssh/server.key&cert=/Users/tadas/.ssh/server.crt'

Đối với macOS, bạn có thể thêm file server.crt vào Trusted System bằng cách kéo file .crt vào Keychain tool.

Lưu ý

Https và Http không thể đồng thời giao tiếp trên cùng 1 cổng được, nếu bạn cần sử dụng cả 2, hãy khởi động 1 trong 2 phương thức trên 2 cổng khác nhau.

tham khảo chính tại: https://gist.github.com/tadast/9932075