# Cloudflare перед сайтом

> Сайт за Cloudflare: на Free і Pro наш сертифікат стоїть на вашому сервері, на Business і Enterprise — оновлюється в Cloudflare скриптом через API.

URL: https://zrazu.com/docs/ssl-auto-cloudflare/

Якщо сайт працює через проксі Cloudflare (помаранчева хмарка в DNS), відвідувачі бачать сертифікат, який віддає Cloudflare, а не ваш сервер.

## Тарифи Free і Pro

Cloudflare сам видає безкоштовний сертифікат для відвідувачів, і поставити туди свій на цих тарифах не можна. Наш сертифікат потрібен на **вашому сервері** — щоб зв'язок Cloudflare → сервер теж був захищений і перевірявся (режим **SSL/TLS → Full (strict)**). Налаштуйте автоматичне оновлення на сервері за інструкцією для нього: [сервер Linux](https://zrazu.com/docs/ssl-auto-linux.md), [cPanel](https://zrazu.com/docs/ssl-auto-cpanel.md), [Kubernetes](https://zrazu.com/docs/ssl-auto-kubernetes.md).

## Тарифи Business і Enterprise — свій сертифікат у Cloudflare

Тут можна завантажити свій сертифікат (**SSL/TLS → Edge Certificates → Upload Custom SSL Certificate**), але Cloudflare його не поновлює. Скрипт нижче раз на добу забирає свіжий сертифікат за посиланням і оновлює його в Cloudflare через API. Запускайте його на будь-якому сервері Linux із `curl` і `openssl` — зазвичай на тому, що стоїть за Cloudflare.

### Що знадобиться

- Посилання на сертифікат із кабінету: `https://api.zrazu.com/ssl-pull/zsp_ВАШ_ТОКЕН`.
- Закритий ключ без пароля. Ключ ECDSA — без блоку `EC PARAMETERS`.
- **Zone ID** — на сторінці домену в Cloudflare, праворуч унизу (**API → Zone ID**).
- **ID сертифіката**: **SSL/TLS → Edge Certificates**, рядок вашого сертифіката → розгорнути → **Certificate ID**. Якщо сертифіката ще немає, спершу завантажте його вручну (кнопка вище) з `https://api.zrazu.com/ssl-pull/zsp_ВАШ_ТОКЕН/fullchain.pem` і своїм ключем.
- **API-токен**: **My Profile → API Tokens → Create Token → Create Custom Token** → дозвіл **Zone → SSL and Certificates → Edit**, **Zone Resources** — лише цей домен.

### Крок 1. Ключ і скрипт на сервері

```sh
sudo mkdir -p /etc/ssl/zrazu/example.com
sudo chmod 700 /etc/ssl/zrazu/example.com
sudo nano /etc/ssl/zrazu/example.com/key.pem
sudo nano /usr/local/bin/zrazu-cloudflare-example.com.sh
```

У перший файл вставте ключ, у другий — скрипт нижче з вашими `ZONE`, `CERT_ID` і `TOKEN`.

```sh file=zrazu-cloudflare-update.sh
#!/bin/sh
# ZRAZU: оновлення власного сертифіката в Cloudflare за особистим посиланням. Запускається cron раз на добу.
set -eu
PULL="https://api.zrazu.com/ssl-pull/zsp_ВАШ_ТОКЕН"
DIR="/etc/ssl/zrazu/example.com"
ZONE="ZONE_ID"
CERT_ID="CERTIFICATE_ID"
TOKEN="API_TOKEN"
API="https://api.cloudflare.com/client/v4/zones/$ZONE/custom_certificates"

umask 077
cd "$DIR"
[ -f cert_id ] || echo "$CERT_ID" > cert_id
curl -fsS --retry 3 --max-time 60 -o new.pem "$PULL/fullchain.pem"
grep -q "BEGIN CERTIFICATE" new.pem || { echo "ZRAZU: за посиланням не сертифікат"; exit 1; }
if [ -f applied.pem ] && cmp -s new.pem applied.pem; then echo "ZRAZU: сертифікат не змінився"; exit 0; fi
cert_pub=$(openssl x509 -in new.pem -noout -pubkey | openssl sha256)
key_pub=$(openssl pkey -in key.pem -pubout | openssl sha256)
[ "$cert_pub" = "$key_pub" ] || { echo "ZRAZU: сертифікат випущено на інший ключ — покладіть новий key.pem"; exit 1; }
json() { awk '{ gsub(/\\/, "\\\\"); gsub(/"/, "\\\""); printf "%s\\n", $0 }' "$1"; }
printf '{"certificate":"%s","private_key":"%s","bundle_method":"force"}' "$(json new.pem)" "$(json key.pem)" > body.json
out=$(curl -sS -X PATCH "$API/$(cat cert_id)" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" --data @body.json)
rm -f body.json
if printf '%s' "$out" | grep -q '"success": *true'; then
  id=$(printf '%s' "$out" | tr -d '\n' | grep -o '"result": *{.*' | grep -o '"id": *"[0-9a-f]*"' | head -n 1 | cut -d'"' -f4)
  [ -z "$id" ] || echo "$id" > cert_id
  mv -f new.pem applied.pem
  echo "ZRAZU: сертифікат у Cloudflare оновлено"
else
  echo "ZRAZU: Cloudflare відмовив:"
  printf '%s\n' "$out"
  exit 1
fi
```

Cloudflare може видати оновленому сертифікату новий ID — скрипт запам'ятовує його у файлі `cert_id` сам.

### Крок 2. Перший запуск і розклад

```sh
sudo chmod 700 /usr/local/bin/zrazu-cloudflare-example.com.sh
sudo /usr/local/bin/zrazu-cloudflare-example.com.sh
echo "23 4 * * * root /usr/local/bin/zrazu-cloudflare-example.com.sh >> /var/log/zrazu-ssl.log 2>&1" | sudo tee /etc/cron.d/zrazu-cloudflare-example.com
```

### Перевірка

1. Перший запуск пише «сертифікат у Cloudflare оновлено», наступні — «сертифікат не змінився».
2. **SSL/TLS → Edge Certificates** — у вашого сертифіката нова дата **Expires On**.
3. Сайт: [https://zrazu.com/tools/ssl/example.com/](https://zrazu.com/tools/ssl/example.com/).

### Якщо не вийшло

- `Authentication error` — токен без дозволу **SSL and Certificates → Edit** або не на цей домен.
- `custom certificate not found` — неправильний `CERT_ID`: видаліть файл `/etc/ssl/zrazu/example.com/cert_id`, виправте рядок у скрипті й запустіть знову.
- «сертифікат випущено на інший ключ» — сертифікат перевипускали з новим ключем: замініть `key.pem`.
