Получаем SSL-сертификат утилитой acme.sh
Получаем SSL сертификат скриптом acme.sh. Запуск acme.sh в docker.
https://github.com/acmesh-official/acme.sh/wiki/Run-acme.sh-in-docker
Примечание
Нашел утилиту lego - Let's Encrypt client and ACME library written in Go.
https://go-acme.github.io/lego/dns/namecheap/
По умолчанию acme.sh выдает сертификаты от zerossl.com.
acme.sh
Установка и обновление acme.sh
sudo apt install socat
curl https://get.acme.sh | sh -s email=user@gmail.com
. ~/.bashrc
acme.sh -h
Обновление скрипта:
acme.sh --upgrade
Получить сертификат acme.sh --nginx
## Auto config for Nginx
acme.sh --issue -d domain.com -d www.domain.com --nginx
Получить сертификат acme.sh --dns dns_namecheap
## @see https://github.com/acmesh-official/acme.sh/wiki/dnsapi#53-use-namecheap
export NAMECHEAP_USERNAME=
export NAMECHEAP_API_KEY=
export NAMECHEAP_SOURCEIP=
acme.sh --issue --dns dns_namecheap -d domain.com -d *.domain.com
Пути к сертификатам:
ls -la ~/.acme.sh/domain.com/
ls -la ~/.acme.sh/domain.com_ecc/
Внимание!
Вы ДОЛЖНЫ использовать команду для копирования сертификатов в целевые файлы. НЕ используйте файлы сертификатов напрямую из каталога ~/.acme.sh/ , они предназначены только для внутреннего использования, структура папок может измениться в будущем.
Обязателен только домен, все остальные параметры необязательны.
acme.sh --install-cert -d domain.com \
--key-file /path/to/keyfile/key.pem \
--fullchain-file /path/to/fullchain/cert.pem \
--reloadcmd "service nginx force-reload"
# Пример:
acme.sh --install-cert -d sub1.domain.cx -d sub2.domain.cx --key-file /etc/nginx/certs/privkey.pem --fullchain-file /etc/nginx/certs/fullchain.pem --reloadcmd "service nginx force-reload"
Docker neilpang/acme.sh
* Автообновление нужно будет добавить в crontab вручную! Должны ли приходить напоминания по истечении срока сертификата?
Регистрируем email:
docker run --rm -it -v "$(pwd)/ssl":/acme.sh --net=host neilpang/acme.sh acme.sh --register-account -m your_email@gmail.com
stdout..
[Sun Oct 29 15:18:25 UTC 2023] Create account key ok.
[Sun Oct 29 15:18:25 UTC 2023] No EAB credentials found for ZeroSSL, let's get one
[Sun Oct 29 15:18:27 UTC 2023] Registering account: https://acme.zerossl.com/v2/DV90
[Sun Oct 29 15:18:29 UTC 2023] Registered
[Sun Oct 29 15:18:29 UTC 2023] ACCOUNT_THUMBPRINT='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
Структура ssl/
ssl/
├── account.conf
├── ca
│ └── acme.zerossl.com
│ └── v2
│ └── DV90
│ ├── account.json
│ ├── account.key
│ └── ca.conf
└── http.header
HTTP-01: Standalone mode
Внимание!
Не работал на Oracle Cloud Instance! Пол дня провозился - не работает бл***!
Не может получить domain.com/.well-known/acme-challenge и всё тут..
Firewall sub-net - Allow All.
Получить SSL-сертификат с проверкой HTTP-01:
acme.sh --issue -d auth.qip.cx --standalone ## рукопожатие HTTP-01, zerossl.com (default)
acme.sh --issue -d auth.qip.cx --standalone --server letsencrypt ## рукопожатие HTTP-01, letsencrypt.org
DNS-01: DNS mode
Получить SSL-сертификат с проверкой TXT DNS-записи _acme-challenge.domain.com.
DNS-01 for Namecheap
DNS плагин для Namecheap - https://github.com/acmesh-official/acme.sh/wiki/dnsapi#53-use-namecheap
Shell-скрипт gen-ssl.sh:
#!/usr/bin/env bash
## @see https://github.com/acmesh-official/acme.sh/blob/master/dnsapi/dns_namecheap.sh
. .env
[[ -z $SSL_REGISTER_EMAIL ]] && { echo "Need to specify in .env: SSL_REGISTER_EMAIL="; exit 1; }
[[ -z $NAMECHEAP_SOURCEIP ]] && { echo "Need to specify in .env: NAMECHEAP_SOURCEIP="; exit 1; }
[[ -z $NAMECHEAP_USERNAME ]] && { echo "Need to specify in .env: NAMECHEAP_USERNAME="; exit 1; }
[[ -z $NAMECHEAP_API_KEY ]] && { echo "Need to specify in .env: NAMECHEAP_API_KEY="; exit 1; }
## Разовая процедура, перед выпуском сертификатов
#docker run --rm -it -v "$(pwd)/ssl":/acme.sh --net=host neilpang/acme.sh acme.sh --register-account -m $SSL_REGISTER_EMAIL
docker run --rm -it -v "$(pwd)/ssl":/acme.sh --net=host \
-e NAMECHEAP_SOURCEIP=$NAMECHEAP_SOURCEIP -e NAMECHEAP_USERNAME=$NAMECHEAP_USERNAME -e NAMECHEAP_API_KEY=$NAMECHEAP_API_KEY \
neilpang/acme.sh --issue -d auth.qip.cx --dns dns_namecheap ## --issue (выпуск) | --renew (продлить, --force)
## @note Вы ДОЛЖНЫ использовать команду для копирования сертификатов в целевые файлы.
## НЕ используйте файлы сертификатов в папке ~/.acme.sh/!
## Они предназначены только для внутреннего использования.
## Структура папок может измениться в будущем.
## Копировать сертификат для каждого домена
#docker run --rm -it -v "$(pwd)/ssl":/acme.sh --net=host neilpang/acme.sh --install-cert -d auth.qip.cx --key-file /acme.sh/auth.qip.cx.key --fullchain-file /acme.sh/auth.qip.cx.fullchain.pem
stdout..
[Sun Oct 29 15:26:44 UTC 2023] Using CA: https://acme.zerossl.com/v2/DV90
[Sun Oct 29 15:26:45 UTC 2023] Creating domain key
[Sun Oct 29 15:26:45 UTC 2023] The domain key is here: /acme.sh/auth.qip.cx_ecc/auth.qip.cx.key
[Sun Oct 29 15:26:45 UTC 2023] Single domain='auth.qip.cx'
[Sun Oct 29 15:26:45 UTC 2023] Getting domain auth token for each domain
[Sun Oct 29 15:26:48 UTC 2023] Getting webroot for domain='auth.qip.cx'
[Sun Oct 29 15:26:48 UTC 2023] Adding txt value: XXXXXXXXXX-XXXXXXXXXX for domain: _acme-challenge.auth.qip.cx
[Sun Oct 29 15:26:54 UTC 2023] The txt record is added: Success.
[Sun Oct 29 15:26:54 UTC 2023] Let's check each DNS record now. Sleep 20 seconds first.
[Sun Oct 29 15:27:15 UTC 2023] You can use '--dnssleep' to disable public dns checks.
[Sun Oct 29 15:27:15 UTC 2023] See: https://github.com/acmesh-official/acme.sh/wiki/dnscheck
[Sun Oct 29 15:27:15 UTC 2023] Checking auth.qip.cx for _acme-challenge.auth.qip.cx
[Sun Oct 29 15:27:16 UTC 2023] Not valid yet, let's wait 10 seconds and check next one.
[Sun Oct 29 15:27:29 UTC 2023] Let's wait 10 seconds and check again.
[Sun Oct 29 15:27:40 UTC 2023] You can use '--dnssleep' to disable public dns checks.
[Sun Oct 29 15:27:40 UTC 2023] See: https://github.com/acmesh-official/acme.sh/wiki/dnscheck
[Sun Oct 29 15:27:40 UTC 2023] Checking auth.qip.cx for _acme-challenge.auth.qip.cx
[Sun Oct 29 15:27:40 UTC 2023] Domain auth.qip.cx '_acme-challenge.auth.qip.cx' success.
[Sun Oct 29 15:27:40 UTC 2023] All success, let's return
[Sun Oct 29 15:27:40 UTC 2023] Verifying: auth.qip.cx
[Sun Oct 29 15:27:42 UTC 2023] Processing, The CA is processing your order, please just wait. (1/30)
[Sun Oct 29 15:27:46 UTC 2023] Success
[Sun Oct 29 15:27:46 UTC 2023] Removing DNS records.
[Sun Oct 29 15:27:46 UTC 2023] Removing txt: XXXXXXXXXX-XXXXXXXXXX for domain: _acme-challenge.auth.qip.cx
[Sun Oct 29 15:27:51 UTC 2023] Removed: Success
[Sun Oct 29 15:27:51 UTC 2023] Verify finished, start to sign.
[Sun Oct 29 15:27:51 UTC 2023] Lets finalize the order.
[Sun Oct 29 15:27:51 UTC 2023] Le_OrderFinalize='https://acme.zerossl.com/v2/DV90/order/XXXXXXXXXX/finalize'
[Sun Oct 29 15:27:52 UTC 2023] Order status is processing, lets sleep and retry.
[Sun Oct 29 15:27:52 UTC 2023] Retry after: 15
[Sun Oct 29 15:28:08 UTC 2023] Polling order status: https://acme.zerossl.com/v2/DV90/order/XXXXXXXXXX
[Sun Oct 29 15:28:09 UTC 2023] Downloading cert.
[Sun Oct 29 15:28:09 UTC 2023] Le_LinkCert='https://acme.zerossl.com/v2/DV90/cert/XXXXXXXXXX'
[Sun Oct 29 15:28:10 UTC 2023] Cert success.
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx
XXXXXXXXXXXXXX==
-----END CERTIFICATE-----
[Sun Oct 29 15:28:10 UTC 2023] Your cert is in: /acme.sh/auth.qip.cx_ecc/auth.qip.cx.cer
[Sun Oct 29 15:28:10 UTC 2023] Your cert key is in: /acme.sh/auth.qip.cx_ecc/auth.qip.cx.key
[Sun Oct 29 15:28:10 UTC 2023] The intermediate CA cert is in: /acme.sh/auth.qip.cx_ecc/ca.cer
[Sun Oct 29 15:28:10 UTC 2023] And the full chain certs is there: /acme.sh/auth.qip.cx_ecc/fullchain.cer
Структура директории ssl/
ssl/
├── account.conf
├── auth.qip.cx_ecc
│ ├── auth.qip.cx.cer
│ ├── auth.qip.cx.conf
│ ├── auth.qip.cx.csr
│ ├── auth.qip.cx.csr.conf
│ ├── auth.qip.cx.key
│ ├── ca.cer
│ └── fullchain.cer
├── ca
│ └── acme.zerossl.com
│ └── v2
│ └── DV90
│ ├── account.json
│ ├── account.key
│ └── ca.conf
└── http.header
Namecheap API KEY
* Whitelisting IP - обязательно.
https://www.namecheap.com/support/api/intro/
Чтобы получить API Access нужно покупок или на балансе $50+ (не уверен, мне выдал NAMECHEAP_API_KEY).
DNS-01 for Ukraine.com.ua (adm.tools)
Пришлось самому писать challenge-плагин dns_ukraine.sh для acme.sh. PR #4943.
https://github.com/sorbing/acme.sh/blob/master/dnsapi/dns_ukraine.sh
DNS_UKRAINE_API_KEY="xxxxx" acme.sh --issue -d domain.com --dns dns_ukraine --server letsencrypt --dnssleep 120
Не удается получить ZeroSSL сертификат через DNS-01 Challenge!
Продление/обновление SSL
acme.sh --renew -d auth.qip.cx --dns dns_namecheap ## --issue: выпуск | --renew [--force]: продлить
### CRON JOB
50 21 * * * /home/user/.acme.sh/acme.sh --cron --home /home/user/.acme.sh > /dev/null
Если сертификату меньше 2 месяцев, то при запросе на выпуск получим:
[Sun Jan 7 17:55:41 EET 2024] Domains not changed.
[Sun Jan 7 17:55:41 EET 2024] Skip, Next renewal time is: 2024-03-06T14:43:23Z
[Sun Jan 7 17:55:41 EET 2024] Add '--force' to force to renew.
При повторном запросе сертификата:
[Sun Jan 7 17:57:04 EET 2024] domain.com is already verified, skip dns-01.
[Sun Jan 7 17:57:04 EET 2024] Verify finished, start to sign.
#ssl #https #acme.sh #dns-01 #http-01 #acme-challenge