В данной статье будет описан реальный способ получения сертификата от Let's Encrypt в ручном режиме для его дальнейшей установки на веб-сервер Windows (IIS/Microsoft Azure) или Linux (полностью ручной режим). Из-за отсутствия официального клиента под Windows для генерации сертификата будет использоваться дистрибутив Linux.

image

Предыстория: с самого начала для сайта нашей Московской компании (по ссылке уже установлен тестовый бета-сертификат Let's Encrypt) был необходим «простой» SSL-сертификат для подтверждения домена и шифрования данных.

В первые дни открытия заявок на бета-тестирование и было принято решение записаться и вот недавно пришло письмо, которое сообщает о том, что теперь программа ACME сгенерирует валидный сертификат для нашего домена:



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

Как это работает


Полное описание процесса доступно по этой ссылке.
Важно лишь знать, что для подтверждения владения доменом и успешной генерации сертификата нужно будет иметь доступ к записям DNS или к серверу куда ссылается A-запись, что вполне логично.

Смысл программного набора Automated Certificate Management Environment (ACME) (написан на Python) в том, чтобы автоматизировать генерацию и установку сертификата в Linux-окружении.

Существует неофициальный Windows-клиент с открытыми исходными кодами, который может генерировать и устанавливать сертификаты на Windows IIS и Amazon Web Services, но у нас была задача получить ключи и установить их вручную. Предлагаю любому желающему написать статью по работе с ним.

Процесс по шагам


Использовалась официальная инструкция.
Пользователи Linux могут использовать текст ниже как пример генерации сертификата в ручном режиме.

1. Запустите ваш любимый дистрибутив Linux (мы использовали Debian 8).

либо 2. Установите Git и выполните команды ниже:

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt

или 2. Скачайте и распакуйте в папку данный архив и перейдите в эту папку

3. Запустите установку и генерацию с помощью

./letsencrypt-auto --agree-dev-preview --server \https://acme-v01.api.letsencrypt.org/directory -a manual auth

Вам будет предложено ввести электронную почту для восстановления в будущем.
Ключ -a manual позволит сгенерировать ключи в ручном режиме без их автоматической установки на веб-сервер.

4. Далее введите домены для которых вы хотите создать сертификаты


5. Подтвердите сохранение вашего адреса в логах Let's Encrypt


6. Подтвердите владение доменом


Это один из ответственных моментов в режиме ручной регистрации.
Обратите внимание: нас просят создать ответ на запрос, который возвращает Content-Type text/plain.

Такой ответ не пройдёт и подтверждение выдаст ошибку:


Нужно, чтобы было так:


Если у вас сервер на Windows (с поддержкой Razor Views, аналогично и с MVC), то самый простой способ создания правильного ответа:
а) создать папку .well-known и в ней папку acme-challenge
б) поместить туда файл [запрос].cshtml
в) в содержание этого файла добавить:
@{Response.ContentType = "text/plain";Response.Charset = "";}здесь проверочный код

7. После успешной проверки, будут созданы следующие сертификаты в папке /etc/letsencrypt/live/[имя домена]:

privkey.pem — приватный ключ для сертификата
Используется Apache для SSLCertificateKeyFile и nginx для ssl_certificate_key.

cert.pem (сертификат сервера)
Используется Apache для SSLCertificateFile.

chain.pem (сертификат цепочки)
Он же используется Apache для SSLCertificateChainFile.

fullchain.pem (соединение chain.pem и cert.pem)
Он же используется nginx для ssl_certificate.

7. Теперь пришло время сконвертировать его в родной для Windows .pfx формат.
Перейдите в папку /etc/letsencrypt/live/[имя домена] (откройте терминал в режиме администратора с помощью команды su):

cd /etc/letsencrypt/live/[имя домена]

Запустите OpenSSL с помощью команды:

openssl

и начните конвертацию с помощью команды:

pkcs12 -inkey privkey.pem -in fullchain.pem -export -out mydomain.pfx

Вас попросят ввести пароль и подтвердить его.



8. Мы получили сертификат mydomain.pfx, который теперь можем использовать в Windows-окружении.

Важно знать, что сертификаты Let's Encrypt валидны 90 дней. Рекомендуется обновлять их каждые 60 дней. На электронную почту, которую вы указали для генерации, будут приходить уведомления об истечении сертификата.

Буду рад услышать ваши замечания или пожелания к статье.
Планируете ли вы использовать сертификаты от Let's Encrypt в своих проектах

Проголосовало 423 человека. Воздержалось 83 человека.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Комментарии (43)


  1. Evengard
    06.11.2015 15:25
    +1

    Блин, я даже не знал что они запустили бету, а где зарегистрироваться?


    1. MalcolmReynolds
      06.11.2015 15:27
      +1

      1. Evengard
        06.11.2015 16:18
        +1

        Спасибо!


  1. Yahweh
    06.11.2015 15:50
    +1

    Сертификат можно получить только на www.example.com/example.com или на other.example.com тоже можно?


    1. MalcolmReynolds
      06.11.2015 15:58
      +1

      Тут есть немного информации, но пока в бете выдали на домен с www и без www (хотя мы запрашивали только на один без www).


    1. Anakros
      09.11.2015 22:22

      Можно.


  1. Anisotropic
    06.11.2015 15:57
    +1

    90 дней это ограничение для беты, или запустится сервис с таким же ограничением?


    1. MalcolmReynolds
      06.11.2015 16:02
      +2

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


      1. Anisotropic
        07.11.2015 22:06
        -1

        Ясно. Так и знал, что где-то подвох.


  1. blind_oracle
    06.11.2015 16:36
    +1

    90 дней — не интересно.

    WoSign мне выдал на три года без всяких проблем.

    А использовать какую-то приблуду на сервере, которая работает под рутом и будет периодически лазить за сертификатом, лазить в конфиг моего веб-сервера для настройки веб-сайта для подтверждения валидности, а затем для подмены сертификата…

    Зачем мне это всё? Зачем так сложно?


    1. farcaller
      06.11.2015 16:40
      +1

      Ну, объективно говоря, приблуда на сервере на должна работать от рута, и не должна менять конфиг сервера каждый раз. А смысл как раз в том чтобы настроить раз и забыть.


      1. blind_oracle
        06.11.2015 16:50
        -3

        Лично мне проще раз в три года сходить за сертификатом по напоминалке в календаре, чем такое городить.
        Затем уже этот сертификат каким-нибудь Ansible/Puppet/etc раскидать куда надо.

        А их клиент (ACME) мне напомнил какой-то продукт для админов локалхоста, которое всё делает за тебя.
        Поэтому, хоть инвайт на бету и прислали, пользоваться им пока нормальный срок действия сертификатов не введут не собираюсь пока…


        1. farcaller
          06.11.2015 16:53
          -2

          Мне кажется что LE вообще строго говоря и предназначен для админов локалхоста.

          У меня на проде два nginx, и LE'шная схема получения сертификатов действительно несколько попаболь. Пишу вот обвязку на го для мониторинга и самостоятельного перевыпуска, попробую пару доменов все же перенести на LE.


          1. blind_oracle
            06.11.2015 20:11

            Ну, могли бы и для админов просто добавить какой-нибудь более удобный способ выпустить себе сертификаты. Надеюсь, в будущем это будет доступно.


      1. wrewolf
        06.11.2015 16:51
        +1

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


        1. ivlis
          06.11.2015 22:52

          У меня вебсервер в докер-контейнере с read-only файловой системой. Так что придётся и контейнер пересобрать и перезапустить его.


    1. ValdikSS
      06.11.2015 18:39

      Вы используете DNSSEC? Как миритесь с еженедельными переподписями зон?


      1. blind_oracle
        06.11.2015 20:09

        Пользую. Я генерирую ключи (KSK/ZSK) на каждую зону один раз, дальше за меня всё делает BIND автоматом.


    1. iaf
      06.11.2015 22:40
      +1

      90 — это сейчас, пока бета, потом они планировали увеличить.

      Вот у меня, например, wosign через полгода после выдачи один сертификат без объяснения причин отозвал, и поддержка ничего вразумительного не смогла сказать. Благо сертификат был прибит DANE и DNSSEC и использовался исключительно для внутренних нужд, посему отзыв не был дизастером, но все равно было неприятно.

      Что касается приблуды, есть вот такая вещь: github.com/diafygi/letsencrypt-nosudo. Разумеется, не все нужен весь тот воз функционала (и гуев), что есть в официальном клиенте, так что в ближайшее время появятся варианты на любой вкус, API то открыты.


    1. Pulse
      09.11.2015 12:40

      Но есть проблема — сертификаты от Wosign 1 января 2017 SHA-1 станут красными. :(


      1. blind_oracle
        09.11.2015 12:48

        У меня вся цепочка (кроме корня, который StartCom, но это и не важно) — SHA256, так что никаких проблем.


        1. Pulse
          09.11.2015 13:15

          А что к корневому это не относится?


          1. blind_oracle
            09.11.2015 13:22
            +1

            Не относится:

            SHA-1-based signatures for trusted root certificates are not a problem because TLS clients trust them by their identity, rather than by the signature of their hash.
            googleonlinesecurity.blogspot.ca/2014/09/gradually-sunsetting-sha-1.html


  1. pred8or
    06.11.2015 16:56
    +4

    Я бы добавил, что в автоматическом режиме ещё генерируется конфиг для веб-сервера, практически готовый к активации.

    После настройки https очевидным было протестировать при помощи Qualys SSL Server Test. Результат меня удивил. A без каких-либо дополнительных телодвижений.


    1. landy
      06.11.2015 17:41
      +1

      И A+ тоже, но с небольшим телодвижением :)
      для апача например в виртуальные хосты добавить:

                      <IfModule mod_headers.c>
                              Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
                      </IfModule>
      

      ну и включить модуль headers.


      1. stychos
        06.11.2015 20:35

        Я так делал для сертификатов от StartSSL, потом пожалел — даже после того как убрал, сервер продолжает перекидывать клиента на https, независимо от поддомена. А сертификат-то не вилдкардовый.


        1. Devil_Chrono
          06.11.2015 20:54

          А что мешает убрать «includeSubDomains;»?


          1. stychos
            06.11.2015 21:01

            Уже давно всё убрал, у меня оказался малость не тот случай, когда надо бегать за красивыми А+ циферками, при ограниченном сертификате.


            1. Devil_Chrono
              06.11.2015 21:33

              Я имею ввиду, что изначально не нужно было ставить «includeSubDomains;», а теперь, если проблема только на вашем браузере, то можно почистить настройки HSTS.
              И можно подробнее про ограниченный сертификат?


              1. stychos
                06.11.2015 21:37

                Проблема, к сожалению, не только у меня. Про ограничения я имел в виду, что он только на domain.tld. и www.domain.tld. — когда мне понадобилось сделать static.domain.tld., я столкнулся с таким вот конфузом, при этом многие клиенты уже хотят по таким вот настройкам «для А+» =) Ну это, безусловно, мой косяк. За ссылку большое спасибо!


                1. ibKpoxa
                  09.11.2015 11:57

                  Кстати, для статики лучше использовать не поддомен, а отдельный домен, чтобы на него не шли лишние куки.


                  1. grossws
                    09.11.2015 16:48

                    Использование secure в куках чуток улучшает ситуацию в данном кейсе.


                1. aivus
                  10.11.2015 23:18

                  Когда нужен static.domain.tld — просто создаете еще один сертификат


            1. Gendalph
              08.11.2015 01:54

              max-age=0 -> редирект куда и как надо -> отдача правильного HSTS (если всё еще на SSL)


              1. stychos
                08.11.2015 02:00

                Дождусь LetsEncrypt и попробую, спасибо.


                1. Gendalph
                  08.11.2015 02:04

                  Этот костыль опробован и работает на основных браузерах и платформах (крутится в продакшене на одном сайте средней популярности).


  1. Lockal
    07.11.2015 13:23

    А кто-нибудь может подсказать, где IP-адреса регистрирующих машин «will be publicly logged»? Зачем это вообще и что делать пользователям CloudFlare?


    1. istui
      07.11.2015 14:23
      +1

      Для cloudflare можете все равно поставить сертификат, для защиты трафика между вашим сервером и origin pull-сервером (Full SSL — Strict)

      Кроме того, cloudflare обслуживает только определенные порты, если ваш сервер нуждается в защите других портов — вам все равно пригодится LE.


      1. Lockal
        09.11.2015 00:33

        Это понятно. Я про то, что для машин за CloudFlare не допускается утечка IP-адреса. По этому скриншоту из статьи можно предположить, что где-то в интернете в открытом доступе есть пары IP-domain, некоторые из которых раскрывают реальные IP-адреса машин за экранами.


        1. istui
          12.11.2015 11:38

          Насколько я понял, записывается IP машины, с которой был запрошен сертификат.

          Берете любой VPS на пару дней на тест и выходите в этот момент в сеть через него.


  1. la0
    07.11.2015 13:24
    +3

    7. Скопируйте их на Windows-машину.
    8. Теперь пришло время сконвертировать их в родной .pfx формат.
    Для этого установим OpenSSL, распакуем его, добавим в эту же папку наши ключи и запустим от имени администратора:

    Я бы поменял пункты местами и конвертил бы линуксовым OpenSSL(команды идентичны)


    1. istui
      07.11.2015 14:24
      +1

      как вариант — делать все в cygwin


    1. MalcolmReynolds
      07.11.2015 14:58

      Спасибо! Действительно, лишний шаг с установкой openssl в Windows. Обновил инструкцию.