Получаем SSL-сертификат утилитой acme.sh

Категория: IT / WEB / Internet

Получаем 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
Если сайт уже запущен на 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
Profile » Tools menu » Business & Dev Tools » Namecheap API Access » Manage.
* 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