--- layout: post status: publish published: true title: SSL with Nginx author: display_name: sipp11 login: sipp11 email: sipp11@gmail.com url: '' author_login: sipp11 author_email: sipp11@gmail.com wordpress_id: 908 wordpress_url: http://blog.10ninox.com/?p=908 date: '2014-02-12 07:08:24 +0700' date_gmt: '2014-02-12 00:08:24 +0700' categories: - linux - server tags: - ssl --- `https` is pretty much preferred protocol over bare http nowadays and it gets very affordable for basic one sub-domain which you can get as low as $9 a year. However, how to get and use one sometimes pretty much overkill although it is rather simple. Yeah, I keep forgetting since I don't really have to do that frequent. Depending on where you purchase SSL certificate, I pick namecheap. I don't have any reason for it, but they are as reliable as it could be. GoDaddy, to me, is okay--they tend to have lower renewal cost for domain too. Back to SSL certificate, you need to generate a CSR (Certificate Signing Request) to ask for SSL. I'm using openSSL. # openssl req -nodes -newkey rsa:2048 -keyout mywhatever.key -out whatever.csr A series of question will be asked: Country Name (2 letter code) [AU]: US State or Province Name (full name) [Some-State]: NH Locality Name (eg, city) []: Atkinson Organization Name (eg, company) [Internet Widgits Pty Ltd]: 10ninox Ltd Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []: 10ninox.com Email Address []: A challenge password []: An optional company name []: Some fields can be left blank, but you pretty much like to answer all for your own credential. The thing is you should leave challenge password empty, otherwise, you will have to type that every time your Nginx reload or restart. Then you get 2 file mywhatever.key and whatever.csr Back to namecheap, issue your SSL, then paste content of whatever.csr to the form. Wait for a verification step via email. Then you would get your_site.zip with following mails. The whole process should take less than 10-15 minutes as far as my experience goes. Now you have to extract your_site.zip which contains several files something like * 10ninox_com.crt * PositiveSSLCA2.crt * AddTrustExternalCARoot.crt Merge those files into one, 10ninox-ssl-bundle.csr or whatever name you want. $ cat 10ninox_com.crt PositiveSSLCA2.crt AddTrustExternalCARoot.crt > 10ninox-ssl-bundle.csr Then copy the bundle file and mywhatever.key we got earlier to a directory in your server; location is up to you. There is no restricted whatsoever. The last process is to setup Nginx to know where SSL certificate is in Nginx virtualhost file (likely to be /etc/nginx/sites-available/10ninox.com for Debian) This is an example how to configure one: server { listen 443; ssl on; ssl_certificate /opt/projects/10ninox/ssl/10ninox-ssl-bundle.csr; ssl_certificate_key /opt/projects/10ninox/ssl/mywhatever.key; ssl_protocols SSLv3 TLSv1; ssl_ciphers ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM; server_name 10ninox.com; } optional lines: * ssl_ciphers ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM; _means disables all weak ciphers_ * ssl_protocols SSLv3 TLSv1; _means enables SSLv3/TLSv1, but not SSLv2 which is weak and should no longer be used._ It's better to test it first with # service nginx configtest If pass, # service nginx restart =)