me.neoascetic

Бесплатные SSL-сертификаты от StartSSL

Во время разработки rawgithack я понял, что мне потребуется иметь SSL-сертификат. Вариант с самоподписанным не подходил - браузер выдаёт предупреждение только если сама страница запрашивается с неподтверждённого домена, в случае же внешних ресурсов, они молча не загружаются. Недолгий поиск, где бы получить сертификат, да желательно for-free, привёл меня на StartSSL. В моем случае мне требовалась поддержка для нескольких поддоменов (“raw”, “gist”, а теперь ещё и “bb”) - год назад я, толком не разобравшись, решил, что со StartSSL это невозможно, и приобрёл относительно дешёвые сертификаты на другом сервисе. Но когда срок действия их действия подошёл к концу с одной стороны, а с другой - рубль по отношению к доллару весьма просел, я решил попытать счастья со StartSSL ещё раз.

StartSSL обещает дать вроде как неограниченное количество бесплатных SSL-сертификатов, а также предоставляет другие услуги, связанные с шифрованием, но я не вникал за ненадобностью. Некоторые услуги платные - на этом и зарабатывают. Например, отзыв ранее бесплатно выданного сертификата стоит приличных денег. Ну да ладно, не за этим пришли.

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

Итак, идём на StartSSL, кликаем “Control Panel”, затем “Express Lane”. Заполняем и сабмитим форму, берём код валидации из письма, вводим его и снова сабмитим. Сервис установит в хранилище браузера клиентский сертификат, действительный в течение года. Таким хитрым способом проводится аутентификация, поэтому важно сделать бэкап этого сертификата - это ключ к сервису, без него зайти будет нельзя. Я вот, например, ждал целый год, пока сертификат станет невалидным и я смогу получить новый на тот же email.

Далее вводим необходимое доменное имя (второго уровня) и выбираем email, на который уйдёт письмо для подтверждения прав на владение доменом, после чего берём код из письма и вводим его в соответствующее поле. Владение доменом подтверждено.

Пропускаем шаг, где нам предлагается сгенерировать ключи - сделаем это самостоятельно, на своей машине или даже целевом сервере. Создаём файл req.cfg с конфигом для OpenSSL, чтобы не отвечать на одни и те же вопросы постоянно (данные, разумеется, необходимо заменить на актуальные):

[req]
default_bits                = 2048
default_keyfile             = privkey.pem
distinguished_name          = req_distinguished_name
prompt                      = no

[req_distinguished_name]
countryName                 = RU
stateOrProvinceName         = Kaliningrad oblast
localityName                = Kaliningrad
organizationName            = Example Inc.
organizationalUnitName      = .
commonName                  = example.com
emailAddress                = admin@example.com

Выполняем openssl req -config req.conf -newkey rsa:2048 -nodes -keyout subdomain.example.com.pem -out subdomain.example.com.csr - результатом будут два файла, subdomain.example.com.pem - приватный ключ, который необходимо держать в секрете (поэтому лучше сразу выполнить chmod 600 subdomain.example.com.pem), и subdomain.example.com.csr, запрос на подпись сертификата, который необходимо вставить в очередную форму на StartSSL. Далее, вновь в браузере, выбираем домен из списка (скорее всего, он будет здесь только один), а после этого вводим нужный поддомен. Ещё несколько нажатий на “Continue” - и видим в текстовом поле необходимый нам сертификат, который сохраняем в файл subdomain.example.com.crt (в случае чего, его всегда можно получить вновь, выбрав “Retrieve certificate” на вкладке “Tool box” в личном кабинете).

Далее операция повторяется столько раз, для скольких поддоменов необходимо получить сертификат - только успевай сохранять их в нужные файлы.

Настройка nginx

Копируем либо перемещаем файлы сертификатов вместе с приватными ключами в /etc/ssl/private. Для каждого поддомена в конфигах nginx используем директвы ssl_certificate и ssl_certificate_key, указывая пути до сертификата и ключа для него соответственно, а listen 443 ssl заставит nginx слушать необходимый для безопасного соединения порт. Финальный штрих - добавить корневой сертификат центра сертификации и сертификат первого класса его же промежуточного сервера - сформировать т. н. “бандл” (за подробностями сюда). Итак, получаем нужные файлы:

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

А потом запихиваем каждый из них в конец каждого файла сертификата для доменов, в том же порядке (сперва сертификат промежуточного сервера, потом - корневой). Порядок сертификатов внутри бандла чрезвычайно важен.

Если все шаги выполнены успешно, перезагрузка nginx должна сделать https-соединения на соответствующих доменах доступными.

В качестве бонуса. Недавно я узнал, что домены в зоне .tk выдаются бесплатно, то есть даром. Потом мне, конечно, сказали, что этому баяну-бабаяну уже лет десять, но для меня это было настоящим открытием, котором и спешу поделиться.