Rails Development with SSL

Posted by Andrew

Big Picture

Nginx will accept connection on ports 80 (http) and https (443). Under SSL/TLS nginx will negotiate the encryption and proxy any requests that it cannot serve to our trusty mongrel running on port 3000. Mongrel doesn’t handle encrypted traffic, instead we pass a flag (X_FORWARDED_PROTO) that indicates the request came over SSL.

Prerequisites

You will need a functioning Macports installation and a functioning development environment (i.e. you can browse your project at localhost:3000).

Conventions

$ indicates a standard shell prompt.
# indicates the command needs to be run as the root user by assuming root privileges with sudo.

Install nginx with SSL Support

# port install nginx +ssl

Make Your Certs Directory

# mkdir -p /opt/local/etc/nginx/certs
$ cd /opt/local/etc/nginx/certs

Make Your Own Certificate

Follow the prompts but MAKE SURE TO USE *.example.com AS YOUR Common Name!
http://pastie.org/234929
# openssl req -new -x509 -nodes -days 365 -out server.crt -keyout server.key

Create an nginx Configuration File

Use http://pastie.org/234927 as an example.
Edit out my locations with yours. (i.e. Replace /Users/Andrew/Projects/macchiato with wherever your code lives.)
# mate /opt/local/etc/nginx/nginx.conf

Fire Up nginx and Your Mongrel

# /opt/local/sbin/nginx
$ script/server

Check Your DNS

# mate /etc/hosts to make sure app.example.com points to localhost

Accept Your New Certificate

Open https://app.example.com/ in Safari. Select Show Certificate and accept it permanently.
In Firefox you will have to manually import your certificate.
Firefox => Preferences => Advanced => Encryption => View Certificates => Authorities => Import => /opt/local/etc/nginx/certs/server.crt => Make sure Trust this CA to identify web sites is checked => Ok.

ssl_requirement

ssl_requirement is the de-facto standard Rails SSL plugin.

Comments

Leave a response