Всем ssl

November 06, 2015

Зачем нужен ssl

Кроме, того что за нами следят. Он позволяет заглянуть нам в завтрашний день. Разработчики браузеров стали выкатывать разные плюшки работающие только под ssl, например: service worker, push-notifications, spdy/http2. Это повышает доверие пользователей, безопасность и просто будущее веба.

Рекомендую для ознакомления посмотреть этот доклад Владимира Кузнецова

Регистрируемся на https://www.startssl.com, единственный сложный момент – Вход в панель управления проходить по сгенерированому сервисом сертификатом, его нужно спрятать в безопасное место и установить например через Keychain Access.app на Mac.

Ограничения сертификата первого класса!

Обходится, но прибивать определенный сертификат прямо к ip, своеобразное решение

Для того, чтобы ваш сервер засиял

  1. Потвержение владения доменом, проще всего через код посланный на определенный адрес привязаный к домену. (Validation Wizard)

  2. Получение сертификата с помощью CSR (Certificates Wizard)

  3. Установка сертификата на сервер и настройка

Создаем приватный ключ

Startssl предложит создать ключ автоматически, но это создаст угрозу подмены, создавайте его сами

openssl genrsa -out gunlinux.org.key 2048

Создаем Submit Certificate Request (CSR)

openssl req -new -sha256 -key gunlinux.org.key -out gunlinux.org.key.csr

Именно его вы даете центру сертификации и он в ответ возвращает вам сертификат, назовем его gunlinux.org.pem

Получаем корневые сертификаты

wget https://www.startssl.com/certs/sub.class1.server.ca.pem
wget https://www.startssl.com/certs/ca.pem

Создаем цепочку сертификатов

cat gunlinux.org.pem sub.class1.server.ca.pem ca.pem > gunlinux.org.chain.pem

Создаем цепочку для OCSP Stapling (ca + sub.class)

cat ca.crt sub.class1.server.ca.pem > /etc/nginx/keys/root.pem

Генерируем dhparams

openssl dhparam -out /etc/nginx/keys/gunlinux.org.dhparam.pem 2048

Настраиваем nginx

server {
  listen :443 ssl;        # порт http
  server_name  gunlinux.org;

  # ssl
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:50m;
  ssl_session_tickets off;

  ssl_protocols TLSv1.1 TLSv1.2;
  ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
  ssl_prefer_server_ciphers on;

  # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
  add_header Strict-Transport-Security max-age=15768000;

  # OCSP Stapling ---
  # fetch OCSP records from URL in ssl_certificate and cache them
  ssl_stapling on;
  ssl_stapling_verify on;
  resolver 8.8.8.8;
  # ca.pem + sub.class1.server.ca.pem
  ssl_trusted_certificate /etc/nginx/keys/root.crt; 
  ssl_certificate      /etc/nginx/keys/gunlinux.org.chain.pem; 
  ssl_certificate_key  /etc/nginx/keys/gunlinux.org.key;
  ssl_dhparam /etc/nginx/keys/gunlinux.org.dhparam.pem;

По настройке единственные два поля с которым вы можете повозиться это ssl_ciphers и ssl_protocols. Проще всего подлядеть их на https://mozilla.github.io/server-side-tls/ssl-config-generator/

Защищаем ваши ключи

chmod 600 /etc/nginx/keys/*

Тестируем сервер

http://ssllabs.com

enter image description here

Вы великолепны