четверг, 22 октября 2015 г.

Let's Encrypt теперь доверенный. Бесплатные SSL сертификаты.

И еще один пост, касающийся HTTPS и бесплатных SSL сертификатов. Напомню что "Let's Encrypt - это некоммерческий проект, стартовавший в прошлом году, и поставивший своей целью обеспечить всех желающих владельцев доменов бесплатными SSL-сертификатами. С момента его официального запуска любой администратор сможет получить сертификат и настроить его поддержку на своём сервере при помощи автоматической утилиты (команда «letsencrypt run» настроит всё самостоятельно, если ваш сервер – Apache или nginx)." (с) geektimes.ru.

Так вот буквально вчера на официальном сайте проекта появилась новость - Let's Encrypt is Trusted (перевод на Хабре - Let's Encrypt теперь доверенный) в которой говорилось о получении проектом кросс-подписей, другими словами, сертификаты выданные Let's Encrypt теперь будут считаться доверенными в большинстве основных браузеров. В качестве примера сайта с установленным сертификатом от Let's Encrypt приводится https://helloworld.letsencrypt.org/

Теперь немного о том как все это работает. Для описания процесса наверное будет проще привести ссылки на несколько статей:

Официальные ресурсы проекта Let’s Encrypt:

Итак, если вкратце ... то что мы имеем (все нижеследующее через призму моего собственного понимания, которое вообщем-то недалеко от истины)? А имеем мы бесплатный сервис выдачи сертификатов. Непосредственно сама выдача осуществляется с помощью специального клиента letsencrypt, который не только отправит запрос на предоставление сертификата и получит его, но еще и проверит ваши права на домен для которого отправляется запрос и автоматически установит полученный сертификат в конфигурацию вашего Apache. Поддержка nginx в процессе, про другие web-серверы, вроде IIS и т.п. пока тишина. 

Несомненно - это прорыв, т.е. в скором времени (согласно вот этому документу полноценный старт сервиса запланирован на 16 ноября 2015 года) любой желаюший сможет абсолютно бесплатно получить SSL сертификат для своего домена. Однако, что смущает лично меня на данный момент. Автоматическая настройка конфигурации web-сервера. Бррр ... не люблю я когда мои web-сервера кто-то конфигурирует за меня. Малейшая ошибка в коде конфигуратора может грохнуть конфиги вашего web-сервера, и хотя их легко восстановить - все равно приятного в этом мало. Вообщем в автоматизации процесса ест как плюсы, так и минусы. Во-вторых, интересно как будет проходить проверка валидности домена, т.е. понятно, что все опять же автоматически, с использованием протокола ACME. Но ... непонятно как будет проходить процесс доказательства принадлежности домена ... согласно статье на Хабре там несколько этапов, включающих в себя создание DNS-записи поддомена example.com (example.com имеется ввиду ваш домен, для которого вы получаете сертификат), создание ресурса, доступного по HTTP на известном URI в example.com ... Это тоже планируется автоматизировать или как? Т.е. как планируется решать эти задачи? Тоже непонятно ... Пока я четко понял только одно ... есть возможность получения сертификата (letsencrypt -d example.com auth) без автоматической конфигурации вашего web-сервера. Как это будет работать на практике, естественно, надо проверять.

Также остаются открытыми несколько вопросов. Понятно что *nix-based системы это конечно хорошо, а если к примеру я использую web-сервер на базе IIS? Как мне получить и установить сертификат для него? Как решать задачу проверки валидности домена, если например клиент letsencrypt запускается на одном сервере, а полученные сертификаты планируется установить на другой? И т.д. и т.п. Вообщем вопросов пока больше чем ответов. 

Чуть позже я попробую разобраться с тем что там есть на данный момент и попробовать получить SSL-сертификат для какого-нибудь тестового сервера. Если кто-то сделает это раньше - отписывайтесь в комментариях. Больше всего меня интересует как происходит процесс валидации домена. Например, в случае, когда я хочу просто получить сертификат с последующей его установкой на другой сервер (к примеру IIS, или на web-хостинг у которого есть только панель управления, а доступ к SSH отсутствует и т.п.) ... скрипт получения сертификата попросит меня вручную внести изменения в DNS-зону или будет пытаться что-то сделать сам? Вообщем больше всего на данный момент интересует сам процесс.

p.s. Еще один положительный момент кстати ... если сервис будет развиваться, а процесс установки сертификатов будет автоматизирован - многие компании, предоставляющие услуги веб-хостинга, как мне кажется, возьмут все это на вооружение. И не за горами тот час, когда в панелях управления веб-хостингом появится дополнительная опция подключения бесплатного SSL сертификата от Let's Encrypt.

Обновлено 22.10.2015 09:11 (MSK)

Ну и как говорится лучше один раз увидеть, чем 100 раз услышать. В данном видео продемонстрирована работа letsencrypt клиента, т.е. получение сертификата и установка его на сервер:


Как видно, процесс полностью автоматизирован и установка SSL сертификата в Apache действительно происходит с помощью одной команды.

Обновлено 22.10.2015 13:02 (MSK)

Вот действительно - правду говорят, лучше один раз увидеть, чем 100 раз услышат. Все-таки я нашел время поднять тестовую платформу (достаточно любого установленного Linux) и посмотреть как работает "установщик" letsencrypt. Первое что мы делаем - это устанавливаем git, если еще не стоял, затем делаем git clone https://github.com/letsencrypt/letsencrypt и запускаем ./letsencrypt-auto --help.

Например я хочу получить SSL сертификат для хоста files.decker.su (такого хоста правда еще нет в природе, но тем неменее, чтобы был ясен общий смысл действий, потом я найду время и все же пройду процесс до конца) ... Запускаем sudo letsencrypt-auto -d files.decker.su auth и видим довольно понятный выбор:


Здесь мы вы выбираем Manual Authentificator, т.к. хотим пройти процесс валидации домена вручную (все, как говорится, придумано и продумано до нас). После чего нам предлагают создать на нашем хосте уникальный файл:

mkdir -p /tmp/letsencrypt/public_html/.well-known/acme-challenge
cd /tmp/letsencrypt/public_html
echo -n '{"header": {"alg": "RS256", "jwk": {"e": "AQAB", "kty": "RSA", "n": "base_64_string"}' > .well-known/acme-challenge/unique_file_name

Где base_64_string - это n для RSA, а unique_file_name - имя файла. В результате этот файл должен отдаваться извне по URL: http://files.decker.su/.well-known/acme-challenge/unique_file_name .

Если же у нас еще не настроен веб-сервер, т.е. совсем не настроен ... нам предлагается инструкция как запустить временный web-сервер на Питоне, специально чтобы пройти валидацию (т.е. чтобы было чем отдать этот файл):

cd /tmp/letsencrypt/public_html
sudo $(command -v python2 || command -v python2.7 || command -v python2.6) -c \
"import BaseHTTPServer, SimpleHTTPServer; \
SimpleHTTPServer.SimpleHTTPRequestHandler.extensions_map = {'': 'application/jose+json'}; \
s = BaseHTTPServer.HTTPServer(('', 80), SimpleHTTPServer.SimpleHTTPRequestHandler); \
s.serve_forever()"

После чего у нас на 80-ом порту поднимается HTTP сервер на Python'е и достучавшись к нему извне по files.decker.su сервер валидации может спокойно считать содержимое файла.

Ну а дальше все просто ... сервер аутентификации запрашивает с вашего HTTP сервера созданный файл:

66.133.109.36 - - [22/Oct/2015 04:48:24] "GET /.well-known/acme-challenge/unique_file_name HTTP/1.1" 200 -

И вы видите сообщение об успешном создании сертификатов:



Смотрим указанный путь [email protected]:/etc/letsencrypt/live/files.decker.su# ls -l
total 0
lrwxrwxrwx 1 root root 39 Oct 22 04:48 cert.pem -> ../../archive/files.decker.su/cert1.pem
lrwxrwxrwx 1 root root 40 Oct 22 04:48 chain.pem -> ../../archive/files.decker.su/chain1.pem
lrwxrwxrwx 1 root root 44 Oct 22 04:48 fullchain.pem -> ../../archive/files.decker.su/fullchain1.pem
lrwxrwxrwx 1 root root 42 Oct 22 04:48 privkey.pem -> ../../archive/files.decker.su/privkey1.pem

И видим что наши сертификаты фактически находятся в /etc/letsencrypt/archive/files.decker.su/ ...

Правда если посмотреть издателя нашего сертификата, то мы увидим там CN = happy hacker fake CA ;) Этакая шутка от Let's Encrypt. Связано это скорее всего с тем, что согласно их FAQ старт проекта ожидается 16 ноября. А клиент пока работает в тестовом режиме о чем нас честно предупреждают при его запуске:


Но тем неменее схема получения сертификатов рабочая, так что остается только дождаться официального старта проекта. И как говорится Let's roll ... т.е. Let's encrypt ;)

Цепочки сертификатов

Немаловажным вопросом при установке SSL сертификата, является цепочка сертификатов. Для сертификатов выданных Let's Encrypt на данный момент она выглядт следующим образом. Напомню, что посмотреть цепочку сертификатов можно с помощью openssl, например так:

openssl.exe s_client -connect helloworld.letsencrypt.org:443

Так вот, для домена helloworld.letsencrypt.org она выглядит следующим образом:

Certificate chain
 0 s:/CN=letsencrypt.org/O=INTERNET SECURITY RESEARCH GROUP/L=Mountain View/ST=California/C=US
   i:/C=US/O=IdenTrust/OU=TrustID Server/CN=TrustID Server CA A52
 1 s:/C=US/O=IdenTrust/OU=TrustID Server/CN=TrustID Server CA A52
   i:/C=US/O=IdenTrust/CN=IdenTrust Commercial Root CA 1
 2 s:/C=US/O=IdenTrust/CN=IdenTrust Commercial Root CA 1
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3

Путь сертификации при этом выглядит следующим образом:


Полезные ссылки
  • Заявка на участие в программе бета-тестирования (Let's Encrypt Beta Participation Request), участие в которой позволяет получить валидный сертификат до официального старта проекта.

6 комментариев :

  1. Извини, что закаживаю твой блог идиотским вопросом, но у меня простой виртуальный хостинг с isp панелью, можно как-то туда прикрутить сертификат от letsencrypt?

    ОтветитьУдалить
    Ответы
    1. Да нет, вопрос вполне актуальный и по делу. У меня в некоторых проектах тоже используются обычные тарифные планы хостинга, т.е. без VDS и т.п. Установка SSL сертификата на виртуальный хостинг возможна только при наличии выделенного IP адреса. Т.е. как правило, виртуальный хостинг делят между собой несколько площадок, т.е. несколько сайтов располагаются на одном IP. Для установки SSL сертификата, зачастую приходится приобретать выделенный IP у провайдера услуг. Ну а далее в ISP панели должна быть вкладка сертификатов, с помощью которой мы импортируем полученные сертификаты в "хранилище", а потом можем использовать в настройках web-сервера для определенного сайта. Официально раздача подписанных сертификатов Let's Encrypt'а должна начаться в середине ноября. Осталось не так долго ... Поэтому как только я получу подписанный сертификат - скорее всего напишу еще одну статью, про то, как поставить его на виртуальный хостинг.

      Удалить
    2. Спасибо за ответ. Я в курсе, что надо выделенный ip - он есть, и в разделе SSL сертификаты могу добавлять, был опыт? прикручивал китайские сертификаты от WoSign. Просто интересно, в letsencrypt также будет возможность получения готовых файлов или надо самостоятельно через программы их получать как у тебя в статье? Просто на последнее знания отсутствуют

      Удалить
    3. Выделенный IP не обязателен. Используя SNI, можно установить сертификат даже на shared-хостинге.

      Удалить
  2. попробуйте использовать asciinema для записи последовательностей консольных команд

    ОтветитьУдалить
  3. google crome на тестовый сайт https://helloworld.letsencrypt.org/ выдает

    Ваше подключение не защищено

    Злоумышленники могут пытаться похитить ваши данные с сайта helloworld.letsencrypt.org (например, пароли, сообщения или номера банковских карт). NET::ERR_CERT_AUTHORITY_INVALID
    Автоматически отправлять в Google информацию о возможных проблемах безопасности.

    ОтветитьУдалить