# Выпуск сертификатов для домена на базе 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 содержат сертификат и приватный ключ соответственно.