====== Все, что нужно знать про Let's Encrypt, от localhost до Kubernetes ====== * [[https://habr.com/ru/companies/webo/articles/327410/|Распространение стандарта TLS SNI]] * [[https://habr.com/ru/articles/708510/|Сертификаты Let's Encrypt и ACME вообще во внутренней сети]] * [[https://www.ssl.com/ru/%D1%81%D1%82%D0%B0%D1%82%D1%8C%D1%8E/%D1%87%D1%82%D0%BE-%D1%82%D0%B0%D0%BA%D0%BE%D0%B5-%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB-acme/|Что такое протокол ACME?]] Automatic Certificate Management Environment * [[https://habr.com/ru/articles/792430/|Как выдавать бесплатные SSL сертификаты с помощью certbot, Nginx и Docker]] ===== Реклама ===== * Расширение протокола TLS (Transport Layer Security) - SNI (Server Name Indication) и бесплатные сертификаты от Let's Encrypt, на основе DV (Domain Validation), открыли возможность сделать безопасными соединения во "всем интернете", а протокол с мультяшной аббревиатурой ACME (Automated Certificate Management Environment), позволил автоматизировать процессы управления сертификатами * Давайте на практически полезных примерах разберемся, как все это устроено ===== Техническое задание ===== * Получить Let's Encrypt сертификат для сайта в "ручном" режиме используя DNS и HTTP/HTTPS/code/file-based Domain Validation * Автоматизировать управление сертификатами с помощью ACME-клиента Certbot * Автоматизировать управление сертификатами в Kubernetes с помощью оператора cert-manager ===== Запись вебинара ===== * Ютуб: https://youtu.be/74KpYfTNffM * Рутуб: https://rutube.ru/video/61ae7d137f22c4180c186e32683f731f/ * Вк: https://vkvideo.ru/video-2190892_456239496 * Тэги: HAProxy, Apache, Nginx, Linux, Docker, Kubernetes, Minikube, Ingress, ACME, Certbot, cert-manager ===== Шаг 1. Что у нас есть, для начала ===== * site*.mgtu.ru # hostnamectl hostname vps * [[Локализация системы#Локализация временной зоны]] * [[Технология Docker]] * [[Система Kubernetes#Установка minikube]] ===== Шаг 2. Управление сертификатами Let's Encrypt "вручную" ===== * [[Letsencrypt Certbot]] ===== Шаг 3. Автоматическое управление сертификатами Let's Encrypt ===== * [[Letsencrypt Certbot#Запрос и подтверждение сертификата "автоматически"]] vps:~# systemctl disable apache2.service --now ... vps:~# systemctl disable nginx.service --now ===== Шаг 4. Управление сертификатами Let's Encrypt в Kubernetes ===== * [[Технология Docker]] * [[Система Kubernetes#Установка minikube]] * Если есть время, можно: * [[Система Kubernetes#Использование в minikube своих docker образов]] * [[Технология Docker#Приложение golang gowebd]] * или, использовать образ httpd и lifecycle postStart exec * [[Система Kubernetes#Deployment]], [[Система Kubernetes#Service]] * [[Система Kubernetes#"Внутри" minikube]] * [[Система Kubernetes#Minikube ingress-nginx-controller]] * [[Система Kubernetes#ingress example]] (с tls) student@vps:~/webd-k8s$ curl -H "Host: siteN.mgtu.ru" http://192.168.49.2 -v student@vps:~/webd-k8s$ curl -H "Host: siteN.mgtu.ru" https://192.168.49.2 -kv * [[Сервис Keepalived]] (для 443, можно, для демонстрации, и 80) #Add port 80 for demonstration how does a cert-manager work virtual_server 195.19.40.42 443 { lb_algo wlc lb_kind NAT protocol TCP real_server 192.168.49.2 443 {} } $ curl http://siteN.mgtu.ru -v $ curl https://siteN.mgtu.ru -k * Kubernetes [[Система Kubernetes#cert-manager]] student@vps:~$ kubectl -n my-ns get pods ... cm-acme-http-solver-... ... student@vps:~/webd-k8s$ kubectl -n my-ns get ingress -o yaml | grep acme-challenge student@vps:~/webd-k8s$ curl http://siteN.mgtu.ru/.well-known/acme-challenge/NNNNNNNNNNNNNNNNNNNNN student@vps:~/webd-k8s$ kubectl -n my-ns exec -ti pods/my-webd- -- bash ИЛИ student@vps:~/webd-k8s$ kubectl run -ti my-debian --image=debian -- bash :/# apt update; apt install curl :/# curl http://siteN.mgtu.ru/.well-known/acme-challenge/NNNNNNNNNNNNNNNNNNNNN * Убираем 80-й порт из Keepalive * Использование Nginx ([[Сервис HTTP#Прокси "красивого" URL в приложение (пример 3)]]) или [[Решение HAProxy]] ... frontend ft-vps mode http bind *:80 default_backend bk-minikube-ingress backend bk-minikube-ingress mode http server minikube 192.168.49.2:80 check $ curl https://siteN.mgtu.ru -v