Пришлось искать способ защитить домены в зонах RU, РФ...
Если вам нужен SSL-сертификат, но вы не являетесь специалистом в веб-технологиях, то эта заметка для вас. Описан простой способ выпуска базового SSL-сертификата Let’s Encrypt в ручном режиме, на локальном компьютере с Windows, с помощью приложения Certbot. Этот способ позволяет получить файлы SSL-сертификата в папку на своём локальном компьютере, после чего можно установить сертификат на свой хостинг.
Потребность в SSL-сертификатах возникла у меня в связи с тем, что срок старых истёк, а создать новые оказалось невозможным из-за возникших ограничений на доменные зоны RU и РФ. Если у вас такая же проблема или вам просто надоело искать веб-сервис для выпуска SSL-сертификатов, то эта заметка вам поможет.
Поскольку я пока не знаю наилучшего пути, то ниже просто опишу ту последовательность действий, которую сам выполнил и которая позволила мне создать SSL-сертификаты для десяти своих доменов (в том числе в зонах RU и РФ), а значит и вам этот способ может помочь.
Создание SSL-сертификата на локальном компьютере
Установил на свой локальный компьютер (с операционной системой Windows 11) программу Certbot.
Установочный файл Certbot взял с официального сайта здесь (см. ссылку на загрузку дистрибутива в п.3 на открывшейся по ссылке странице).
Запустил скачанный установщик и в диалоге установки изменил адрес установки на:C:\Certbot
Работа с программой Certbot осуществляется через командную строку или PowerShell (я использовал PowerShell). На время выпуска сертификата, естественно, компьютер должен быть подключен к сети Интернет.
Открыл PowerShell (х86) с правами администратора.
Для этого нажал на кнопку "Пуск" и набирая первые буквы названия PowerShell увидел нужный пункт в результатах поиска, затем правым щелчком мыши по названию найденной программы открыл контекстное меню и в нём выбрал пункт "запуск от имени администратора".В окне PowerShell с помощью команд
cd
перешёл в каталог Certbot (вводил как показано на скриншоте и нажимал в конце строки клавишу Enter):
Вставил из буфера обмена команду для создания сертификата (можете скопировать её из этой строки):
certbot certonly --authenticator manual
И нажал клавишу Enter.
Перед нажатием Enter окно PowerShell выглядело с этой командой так:
Система предложила ввести свой email (я ввёл), согласился с условиями (нажимая клавишу Y), в следующий раз программа на этом шаге уже не просила вводить email, а сразу предлагала ввести имена доменов (я вводил сразу по два – второй с www, через запятую):
Программа попросила создать файл проверки прав на домен. При этом показано какую строку символов и в файл с каким именем поместить, по какому адресу на веб-сервере этот файл положить:
Поскольку я вводил по два доменных имени (обычное и с www), то после нажатия Enter программа точно так же просила создать ещё один проверочный файл.
С помощью Filezilla Client я создал нужные файлы по требуемому адресу, создав нужные директории. Выделенный текст из окна PowerShell можно копировать просто правым кликом, или привычным сочетанием клавиш Ctrl+C.
Нажал клавишу Enter для создания сертификата, но только после того, как проверочные файлы на веб-сервере были созданы.
Система сообщила об успешном создании файлов сертификата, которые я нашёл на своём локальном компьютере, в папке:C:\Certbot\archive\[имя домена]
Если бы сертификат не был создан, то программа сообщила бы об ошибке.
Вот и всё, сертификаты готовы!
Для установки их на хостинг мне потребовались три файла из четырёх, из данной папки:
cert1.pem – сертификат
chain1.pem – промежуточный сертификат
privkey1.pem – приватный ключ
Ограничения
Через каждые 90 дней нужно перевыпускать сертификат заново.
P.S.:
Я ещё не озадачился тем, как автоматизировать описанный выше процесс (мне интересен перевыпуск сертификата именно на локальном компьютере с Windows). Было бы здорово, если бы знающий человек написал в комментариях как это сделать.
Комментарии (65)
ifap
22.05.2022 23:49+10Если вам нужен SSL-сертификат, но вы не являетесь специалистом в веб-технологиях
то с грехом пополам вы его выпустите по этой или другой подобной инструкции, а потом все равно не сможете правильно вкорячить на свой сайт ;)
VadimLjovkin Автор
23.05.2022 08:03+1Уже несколько обновляю сертификаты на своих небольших личных проектах. Устанавливаю через обычный визуальный интерфейс хостинга. Никакой автоматизации в этом отношении нет. Пока до этого руки не дошли. Не всё сразу :)
ifap
23.05.2022 11:02Так я не про Вас лично ;) Я просто сомневаюсь, что запрос сертификата "вручную" - наибольшая проблема в процессе ручной установки.
SDKiller
23.05.2022 02:05+2А зачем вообще на локальном компе это делать, если есть доступ к серверу?
MasMaX
23.05.2022 07:58+2Тоже задумался надл этим вопросом. Где сертификат используется - там и генерируется. Тем более у certbot есть встроенный механизм автообновления.
VadimLjovkin Автор
23.05.2022 08:09+2Чтобы мне было понятно что делаю. Встречаемые мною инструкции по установке Certbot на сервер для меня пока что сложны (всё-таки у меня совсем другой профессиональный профиль). В различных видео-мануалах авторы зачастую забывают указать даже название открытой перед ними программы, в которую они вводят команды. Думают, что всё очевидно, наверное... Много потерянного времени. Мне сейчас проще так выпустить себе сертификаты.
terantul
23.05.2022 04:05+4Почему я не пишу статьи на Хабр? Потому что следую совета умного человека - забей тему потенциальной статьи в гугл и посмотри на результат, если имеется хотя бы 3 линка на идентичный материал - писать не стоит, ибо это уже с 99% вероятностью есть на Хабре.
-Это уже было в Симпсонах(с)
VadimLjovkin Автор
23.05.2022 08:10+3Я на Хабре не нашёл. Поэтому и написал, чтобы помочь таким же нуждающимся как я :)
BosonBeard
23.05.2022 04:12+6А я поддержу автора, хоть материал и во многом вторичен, чувствуется, что человек постарался, как минимум тщательно оформил текст. Может кому этот материал в итоге пригодится.
13werwolf13
23.05.2022 06:10+2плюсик за оформление статьи и минусик за тему
>> генерировать сертификат на десктопе с виндой при том что он нужен на сервере с линуксом
>> генерировать сертификат НЕ через DNS подтверждение
>> не сделать авторотейт сертификатовпохоже на выстрел в ногу. если взять не certbot а какой нибудь lego например то он с огромной кучей DNS провайдеров по api умеет работать. закинуть в крон и не париться о сертификате долгие годы.
13werwolf13
23.05.2022 07:23upd:
генерировать сертификат НЕ через DNS подтверждение
написал не так как было в голове и теперь не могу отредактировать, но думаю и так понятно что я имел ввиду
VadimLjovkin Автор
23.05.2022 08:18+1Спасибо за плюсик :). Это приятно.
Заметка для неспециалистов, это однозначно сформулировано в начале. Мне бы она точно помогла сэкономить время, поэтому я её и написал. Про авторотейт я пока даже не слышал.
Никто не рождается со знанием в голове. Все его добывают. На это требуется время.
Если человек не знает как выпустить SSL-сертификат, но ему срочно нужно, то мануал ему поможет. Как помог бы мне. Я рад этому.
Спасибо за минус, буду знать за что :)
Anrikigai
23.05.2022 09:32+2Есть разные кейсы. Если Shared hosting не поддерживает letsencrypt сам из коробки, установить туда certbot будет проблематично. Все, что вы можете - заливать файлы по FTP/через веб морду.
Касательно DNS - во-первых, все равно нужно установить/запустить в докере... Во-вторых, спасибо за ссылку на lego, не знал про него. К сожалению, несмотря на значительное количество поддерживаемых DNS провайдеров, воспользоваться сможет далеко не каждый:
Нормальная статья для новичков, которым надо, чтобы быстренько заработало. А оптимизируют потом, по мере появления опыта.
13werwolf13
23.05.2022 09:39+2Не соглашусь про шаред хостинги, обычно у них le работает вообще по галочке в настройках вихоста
А причём тут лохер я вообще не понял
Anrikigai
23.05.2022 10:17+1Ключевое слово "обычно". В свое время, когда я выбирал дешевый хостинг, для меня было экстазом наличие такой фичи у выбранного дешевого хостера. Обычно просили денег. У "больших" может и норма, но здесь речь именно про совсем новичков.
Что такое "лохер" теперь уже я не понял :)
Впрочем, это неважно. Я лишь хотел сказать, что для таких статей место вполне есть. Сейчас я могу надувать щеки и рассказывать, как собрал на внешнем сервере контейнер с Nginx reverse proxy для доступа к домашним ресурсам, спрятанным за двойным Hide NAT с автоматическим обнаружением новых контейнеров, генерации для них конфигов и обновлением сертификатов. Но много лет назад мне бы такая инструкция весьма пригодилось бы.
nrr
23.05.2022 08:20Если у вас виртуальный или физический сервер, то автоматическое продление сертификатов обычно идет из коробки.
Для такого случая здесь инструкции для различных серверов:
https://certbot.eff.org/instructions
В форме необходимо выбрать тип веб сервера и свою ОС, и вы получите пошаговую инструкцию по настройке certbot для получения сертификатов letsencrypt.Если у вас виртуальный хостинг, то вот здесь есть инструкции для различных хостинг провайдеров, правда российских там не обнаружил:
https://certbot.eff.org/hosting_providers/VadimLjovkin Автор
23.05.2022 08:25+1К сожалению на моём хостинге нет автовыпуска и тем более автопродления SSL-сертификатов (даже базовых). Хостер хочет более 5 тыс. руб. за сертификат :).
Не спрашивайте какой хостер, я всё равно пока менять не собираюсь :).Спасибо за ссылки! Я там был, но инструкции для меня оказались сложны (много пробелов пока что).
stand_alone_complex
23.05.2022 08:25-2В свете всяких пакостей в опенсорс проектах — "скачайте не ведомую зверушку и выпустите с её помощью сертификат". В скриптах хоть посмотреть можно что должно происходить...
VadimLjovkin Автор
23.05.2022 08:27+1Что скачивать и ставить каждый решает сам. А в скриптах смотреть ещё умение требуется. Заметка написана для неспециалистов.
kAIST
23.05.2022 10:16А ничего, что certbot это и так скрипт, который написан на питоне?
Кстати, вы этот комментарий написали тоже через скрипт?
allohakat
23.05.2022 08:25+3Мне по заголовку казалось, что здесь будет что-то более нетривиальное, какой-нибудь альтернативный бесплатный провайдер хотя бы… А всё опять про let's encrypt.
У меня есть содержательный вопрос, для которого let's encrypt, к сожалению, не подходит. Допустим, я для своего pet project с одной стороны не хочу морочиться с DNS (слишком уж он pet), а с другой — не хочу, чтобы у пользователей браузер орал «соединение небезопасно!!!1111одинодин». Как получить сертификат на «голый» IP-адрес? Платники (вот уж кто всем торговцам воздухом торговец воздухом, по сравнению даже со сторонниками копирайта) такое позволяют, let's encrypt сопротивляется.VadimLjovkin Автор
23.05.2022 08:31Спасибо за интерес к теме! К сожалению я не специалист в этом вопросе. Просто поделился способом, который сам искал. Может быть кто-то из знатоков сможет рассказать как получить сертификат на «голый» IP-адрес. Или поделится адресом бесплатного альтернативного провайдера.
42p
23.05.2022 10:08https://zerossl.com/pricing/
Они умеют выпускать сертификаты на голый ip через http верификацию. Через тот acme.sh клиент, но нужно немного запариться и законфигурировать туда свою учетку от zerossl.
tuxi
23.05.2022 08:42+6Люди, вы чего такие злые? На фоне массы статей "боремся с дидосом с помощью скриптов на php", это вполне годная статья, да еще и оформленная толково.
VadimLjovkin Автор
23.05.2022 08:49Большое спасибо!
klerik
23.05.2022 09:49+4Есть вот такой неплохой способ.
И в принципе это полуавтоматический или даже автоматический способ для получения SSL для всех своих проектов. IMHO это более удобно, чем ваш способ.
Splendidus
23.05.2022 10:47Зашел в комменты увидеть ссылку на этот софт. ) Лучшая софтина для SSL под Винду.
Интуитивно понятный интерфейс, даже не нужно разбираться в технологиях.
Софтина сама подвяжет серт на нужный сайт в IIS.
И автопродление. Поставил и забыл.
CarrolCox
23.05.2022 12:22не хотите заниматься выпуском и ротацией самостоятельно?
не хотите / не умеете / нет времени автоматизировать всё это?
посмотрите на готовые встроенные опции работы с let's encrypt у хостера или у вашего web / reverse proxy / api gateway сервера
например traefic / kong / openresty (nginx + lua) уже умеют это сами или с плагином
VadimLjovkin Автор
23.05.2022 13:12Мой хостер продаёт базовые SSL )).
CoderSafe
23.05.2022 13:40+1Согласен, у меня та же ситуация. Особенно когда при санкциях нужно от 1-2 дней что бы выпустить сертификат (по крайней мере так у моего хостера). А благодаря этой статье можно получить SSL за 5 минут и пользоваться. Сейчас ищу только как сделать авто продление )
endpoints
23.05.2022 15:09+1Сохранил спасибо! только вчера хотел установить бесплатный SSL на свой сайт btat.ru Сегодня думаю получится самому сделать
VadimLjovkin Автор
23.05.2022 15:12Спасибо за обратную связь! Рад пользе!
endpoints
23.05.2022 19:14не получается у меня((( делаю на windows 7, пишет:
endpoints
23.05.2022 19:20если просто запускать certbot.exe выдает ошибку
как я понял, для запуска требуется python, ладно установил python 3.8, но ошибка не ушла
endpoints
23.05.2022 19:26потом установил обновление kb2999226 чтобы добавить эту библиотеку, но все равно такая ошибка
endpoints
23.05.2022 19:45пошел по другому пути, зашел на свой сервер через rdp, запустил, вроде все идет, но не понял этот пункт:
Нажал клавишу Enter для создания сертификата, но только после того, как проверочные файлы на веб-сервере были созданы.
какие проверочные файлы надо создавать? и куда их ложить?
CoderSafe
23.05.2022 19:52+1Смотри, давай помогу.
Когда у тебя появляется такая запись то ты должен создать на сервере директиву example.com/.well-know/acme-challenge/
И потом создаешь ФАЙЛ(не папку) указанную выше и в ней же ты должен написать вот это
VadimLjovkin Автор
23.05.2022 22:11Да, совершенно верно!
"Проверочные файлы" - это простые текстовые файлы без расширения, с указанным в окне PowerShell именем и с указанным содержимым (их Вам подчеркнули красным выше), которые должны оказаться по указанному там же (в окне PowerShell) адресу.
Вы можете создать такие файлы через обычный Блокнот (если файл сохранится с расширением, например .txt, то просто удалите это расширение оставив только имя файла). Затем созданный файл нужно поместить на свой веб-сервер в ту папку, которую показывает Вам PowerShell. Только после этого можно нажать Enter на клавиатуре. То есть нужно делать всё последовательно по инструкции: программа попросила Вас создать файл - создайте и положите его на сервер, потом нажмите Enter. Если Вы ввели два доменных имени (например, второе с www), то программа попросит создать ещё один проверочный файл. Создайте второй и только после этого нажмите Enter.
Эти файлы называются проверочными потому, что Certbot проверяет их наличие, заглядывая через интернет. И если находит, то понимает, что домен принадлежит именно Вам (ведь Вы создали эти файлы там, где он попросил и с тем содержимым, которое он указал).
Для того, чтобы поместить проверочные файлы на веб-сервер я использовал доступ по FTP к своему сайту (с помощью программы FileZilla, она бесплатна, имеет русский интерфейс).
Но, если Вы до сих пор не пользовались FTP-клиентом (например, FileZilla), то можете поместить проверочные файлы в нужную папку (директорию) и через обычный файловый менеджер Вашего хостинга. В любом случае Вам понадобится создать недостающие папки (директории) с именами:
.well-known
и в ней папкуacme-challenge
Выглядят проверочные файлы у меня в FileZilla так, как показано в нижней части скриншота (это снимок только нужной части окна FileZilla): нижняя стрелка показывает на файлы, а верхняя стрелка показывает на путь к файлам; у меня там всегда ещё папка docs - она корневая, так устроен мой хостинг, у Вас может быть иначе.
Поэтому когда мне PowerShell пишет путь
http://orgpsiholog.ru/.well-known/acme-challenge/
я должен проверочные файлы поместить с учётом "docs", т.е. так:http://orgpsiholog.ru/docs/.well-known/acme-challenge/
endpoints
24.05.2022 00:42+1Благодарю дружище, создал сертификат, вот только никак не могу привязать к домену, домен находится на reg.ru
Если кто на днях установил там сертификат, дайте ссылку как там делается все это дело
VadimLjovkin Автор
24.05.2022 07:55Очень рад пользе!
По идее, у них должен быть мануал по установке сертификата через веб-интерфейс хостинга. А если нет, то напишите в службу поддержки.
CoderSafe
23.05.2022 19:47Привет, Python тут не причем )
https://windll.com/ru/dll/microsoft-corporation/api-ms-win-core-path-l1-1-0
Ознакомиться с ошибкой и исправить вы сможете тут )
VadimLjovkin Автор
23.05.2022 22:24Работа с Certbot в описанном в статье способе осуществляется не напрямую, только через командную строку или PowerShell. Я использовал только PowerShell, и запустить PowerShell нужно от имени администратора.
frkbvfnjh
23.05.2022 15:17-1А чем Certbot лучше open-ssl?
VadimLjovkin Автор
23.05.2022 15:25+1Certbot - это программа, позволяющая создать SSL-сертификат.
А что Вы подразумеваете под open-ssl ?
89Logic
24.05.2022 21:15Вадим, добрый день! Скажите, а как быть если у меня Wildcard сертификат? Этот способ сработает?
VadimLjovkin Автор
24.05.2022 21:28Доброго времени! Если под WildCard имеется в виду сертификат подтверждающий домен и все его поддомены, то (на сколько я знаю) нет, для каждого поддомена придётся выпускать свой сертификат. Я делал разные сертификаты для домена и его поддомена (и даже не проверил, будет ли работать, если сделать просто для верхнего домена). Но Вы можете это проверить.
42p
LetsEncrypt сертификаты можно выпускать и с верификацией по DNS. Из клиентов например https://github.com/acmesh-official/acme.sh умеет автоматически работать с огромным количеством DNS сервисов и выпускать wildcard сертификаты (т.е. основной домен и все поддомены уровня выше). Возможно даже заведется на windows, но проще гарантированно завести на windows subsystem linux.
Чуть правильнее было бы задать соотвествующий вопрос в Q&A, чем писать очевидный мануал на профильном портале :)
ElleSolomina
Поддерживаю, гораздо полезнее обсуждать нормальные сертификаты и желательно длительные.
karavan_750
Много плюсов к упоминанию acme.sh.
А если воспользоваться ручным режимом, то можно утверждать, что умеет работать с любым DNS сервисом, который доступен миру. (wildcard в ручном режиме доступен)
https://github.com/acmesh-official/acme.sh/wiki/DNS-manual-mode
WinLin2
Использую acme.sh и есть проблема с подтверждением через yandex-dns. В настройках ожидание 600 секунд, в dns записи появляются, а LetsEncrypt срабатывает с десятого раза и обычно только ночью.
idmrty
У Яндекса невероятно долго обновляются DNS-записи. Могут часами не отдавать новые значения — какие уж там 600 секунд...
VadimLjovkin Автор
Я искал информацию о ручном выпуске сертификата на Хабре (очень люблю этот портал), но не нашёл, поэтому написал сам, для таких же неспециалистов в веб-технологиях как и я сам. Спасибо за ссылку!
VadimLjovkin Автор
Мне нужен был способ подтверждения домена по http, поэтому и описанный способ подошёл.