Установка SSL-сертификата от Let’s Encrypt на shared хостинг
Что делать если у Вас виртуальный хостинг и не хочется покупать SSL-сертификат за несколько тысяч рублей?
Конечно, поставить бесплатный от Let’s Encrypt!
Для клиентов cishost.ru в 2016-ом году достаточно было написать в техподдержку и попросить установить сертификат от Let’s Encrypt — специалисты техподдержки устанавливали. Возможно сейчас так же.
На domen-hosting.net требовалось купить выделенный IP за 100р. в месяц, хотя позже, другому клиенту, техподдержка поставила бесплатно.
А вот покупателям хостинга nic.ru и masterhost.ru техподдержка не смогла помочь — ответили поставить можно, ставьте сами.
На VPS/VDS хостингах я устанавливал SSL-сертификат с помощью Certbot, и как это сделать описал в конце статьи Проблемы с Let’s Encrypt в ISPManager.
На nic.ru и masterhost.ru установить Certbot, к сожалению, было нельзя, поэтому нашел другое решение — скрипт CertLE https://github.com/skoerfgen/CertLE.
Первое получение сертификата
Или через wget, или сначала себе, потом по ftp закачиваем CertLE на сервер в домашний каталог юзера. Не в папку сайта! Там он не нужен.
Даем права на исполнение файлу certle:
1 |
chmod 744 certle |
Далее все просто:
1 2 3 4 |
./certle genrsa 4096 > account_key.pem ./certle genrsa 4096 > domain_key.pem ./certle register account_key.pem ваша_почта@mail.ru ./certle cert account_key.pem domain_key.pem -w /*путь к DOCUMENT_ROOT сайта* -d домен.ru -d www.домен.ru --csr csr.pem --cert cert.pem --chain chain.pem --fullchain fullchain.pem |
Этими командами генерируем ключ аккаунта и ключ домена.
Регистрируем c ключом аккаунта свою почту в ACME-сервисе.
На эту почту будут приходить уведомления об окончании срока регистрации домена.
Четвертой командой получаем сам сертификат.
Последнее действие, к сожалению, не автоматизировать — надо ручками добавить, созданные скриптом, файлы сертификатов в панели управления хостингом.
Для masterhost.ru добавлял сертификат (cert.pem) и ключ (domain_key.pem), на nic.ru еще можно указать промежуточный сертификат (chain.pem).
Обновление сертификата
В инструкции об этом ничего не сказано, но на всякий случай, я так же заново сгенерировал ключ домена. Можно попробовать и со старым ключом. Обновление существующего сертификата выполняется той же командой, что и получение сертификата:
1 2 |
./certle genrsa 4096 > domain_key.pem ./certle cert account_key.pem domain_key.pem -w /*путь к DOCUMENT_ROOT сайта* -d домен.ru -d www.домен.ru --csr csr.pem --cert cert.pem --chain chain.pem --fullchain fullchain.pem |
Ошибки
В процессе первой установки не обошлось без ошибок.
Для оригинального CertLE была ошибка:
1 |
PHP Fatal error: Call to undefined function readline() in /home/***/CertLE-master/CertLE.inc.php on line 54 |
Она решается настройкой PHP, или можно добавить функцию readline в CertLE.php согласно https://stackoverflow.com/questions/23238378/call-to-undefined-function-readline. Версия CertLE с уже добавленной функций.
После добавления readline три команды certle успешно выполнились, но получение сертификата все равно не получалось. Возникала ошибка:
1 |
unexpected http status code: 301 |
Оказалось, что на сайте включен редирект с www на без www или что то в этом роде, из-за чего файл, генерируемый CertLE, в браузере можно было посмотреть, но код ответа скрипту не нравился. Решилось временным отключением редиректа. При обновлении сертификата ошибки уже не было.