---
# System prepended metadata

title: Выпуск сертификатов для домена на базе HC Vault PKI

---

# Выпуск сертификатов для домена на базе HC Vault PKI


## Необходимо:
1. Сгенерировать корневой и промежуточный сертификаты для CA:
    - ca.home.office - корневой
    - intermediate.ca.home.office - промежуточный
2. Выпустить сертикат для доступа к Vault по TLS (хост: vault.ca.home.office)
3. Развернуть Vault.

## Подготовка PKI

*Соглашения*:
- домен `home.office`
- Vault доступен по адресу https://vault.ca.home.office
- файл `home-office-all-bundle.pem` содержит в себе: `ca.home.office.crt` (корневой сертификат), `intermediate.ca.home.office.crt` (промежуточный сертификат), 
`intermediate.ca.home.office.key` (секретный ключ промежуточного сертификата в формате PEM)
- путь к секрету в Vault `pki_home_office`
- Vault запущен и распечатан (unseal)

### Настройка Vault

1. Создать секрет для PKI

```bash
vault secrets enable -path pki_home_office pki
```

2. Настроить подписание/выпуск (issue) сертификатов
```bash
vault write pki_home_office/config/ca pem_bundle=@home-office-all-bundle.pem
```

3. Создать политику доступа
```bash
cat <<EOF | vault policy write pki_home_office -
path "pki_home_office*" { capabilities = ["read", "list"] }
path "pki_home_office/roles/*" { capabilities = ["create", "update"] }
path "pki_home_office/sign/*" { capabilities = ["create", "update"] }
path "pki_home_office/issue/*" { capabilities = ["create", "update"] }
EOF
```

4. Активировать аутентификацию по логину/паролю, создать учетную запись (путь pki_pass) и подключить политику
```bash
vault auth enable -path pki_pass userpass
vault write auth/pki_pass/users/cert_creator password=1234569870 policies=pki_home_office
```

5.  Создаем роль, позволяющую выдачу сертификатов для домена и поддоменов
```bash
vault write pki_home_office/roles/home-office allowed_domains="home.office" allow_subdomains=true
```


### Получение сертификата (curl)

*Соглашения*:
- на хосте в контейнере имеются утилиты curl и jq
- Адрес Vault, логин и пароль подключения находятся в переменных VAULT_ADDR, $VAULT_USER, $VAULT_PASSWORD соотвественно.

1. Авторизуемся в Vault, чтобы получить токен
```bash
VAULT_TOKEN=$(curl -k -X POST $VAULT_ADDR/v1/auth/pki_pass/login/$VAULT_USER --data '{"password":"'$VAULT_PASSWORD'"}' | jq -r '.auth.client_token')
```

2. Запрашиваем сертификат/приватный ключ со временем жизни 1 час для домена site1.home.office и сохраняем в файлы
```bash
curl -ks -X POST -H "X-Vault-Token: $VAULT_TOKEN" $VAULT_ADDR/v1/$VAULT_ISSUER --data '{"common_name": "site1.home.office", "ttl": "1h"}' | tee data.raw
cat data.raw| jq -r '.data.private_key' > /certs/site1.home.office.key
cat data.raw| jq -r '.data.certificate' > /certs/site1.home.office.crt
```

Теперь файлы site1.home.office.crt и site1.home.office.key содержат сертификат и приватный ключ соответственно.

### Получение сертификата (consul-template)

*Соглашения*:
- consult-template скачан в виде утилиты или действия выполняются внутри контейнера `hashicorp/consul-template`
- имеется токен для аутентификации в Vault (может быть использован токен из пункта 1 предыдущего шага)

1. Создаем файл с настройками для consul-template и домена site-consul.home.office

```bash
cat <<EOF >> config.hcl
vault {
  address = "https://vault.ca.home.office:8200"
  token="hvs.CAESIMCKDh9o5kNkzlS2RPaIIWZla3rg48wn1TzIOgfBsCTqGh4KHGh2cy5EMEhtSXVhd3Zza1JzUVlWUW1FeUxldjU"
  unwrap_token = false
  renew_token = false

  ssl {
    verify = false
  }
}

template {
    contents="{{ with secret \"pki_home_office/issue/home-office\" \"common_name=site-consul.home.office\" \"ttl=1h\" }}{{ .Data.private_key }}{{ end }}"
    destination="site-consul.home.office.key"
}

template {
    contents="{{ with secret \"pki_home_office/issue/home-office\" \"common_name=site-consul.home.office\" \"ttl=1h\" }}{{ .Data.certificate }}{{ end }}"
    destination="site-consul.home.office.crt"
}
```

2. Получаем сертификат:

```
consul-template -config /opt/consul.hcl -once
```

Теперь файлы site-consul.home.office.key site-consul.home.office.crt содержат сертификат и приватный ключ соответственно.
