# Замена сертификата (веб - интерфейсе) KUMA

<p class="callout danger">Процесс перевыпуска сертификата ядра в версии KUMA 3.2 был изменен! Актуальная информация приведена в онлайн-справке: [https://support.kaspersky.ru/help/KUMA/3.2/ru-RU/275543.htm](https://support.kaspersky.ru/help/KUMA/3.2/ru-RU/275543.htm) и <span class="ui-provider a b c d e f g h i j k l m n o p q r s t u v w x y z ab ac ae af ag ah ai aj ak" dir="ltr">[https://support.kaspersky.ru/kuma/3.2/217747](https://support.kaspersky.ru/kuma/3.2/217747 "https://support.kaspersky.ru/kuma/3.2/217747")</span></p>

### Общая информация

После установки Ядра KUMA установщик создает следующие сертификаты в папке /opt/kaspersky/kuma/core/certificates:

- Самоподписанный корневой сертификат ca.cert с ключом ca.key. Подписывает все другие сертификаты, которые используются для внутренней связи между компонентами KUMA.
- Сертификат internal.cert, подписанный корневым сертификатом, и ключ internal.key сервера Ядра. Используется для внутренней связи между компонентами KUMA.
- Сертификат веб-консоли KUMA external.cert и ключ external.key. Используется в веб-консоли KUMA и для запросов REST API.

<p class="callout warning">Между взаимодействием компонентов KUMA не должно быть SSL-инспекции</p>

### Запрос сертификата от центра сертификации CA

Создаем файл `openssl.cnf`:

```bash
=====это пример, вписываем свои значения======
[ req ]
default_bits = 4096 # RSA key size
encrypt_key = no # Protect private key
default_md = sha256 # MD to use
utf8 = yes # Input is UTF-8
string_mask = utf8only # Emit UTF-8 strings
prompt = no # Prompt for DN
distinguished_name = server_dn # DN template
req_extensions = server_reqext # Desired extensions
[ server_dn ]
countryName = RU # ISO 3166
localityName = Moscow
organizationName = MYCOMPANY
organizationalUnitName = SOC
commonName = kuma.mycompany.ru # Should match a SAN under alt_names

[ server_reqext ]
basicConstraints = CA:FALSE
keyUsage = critical,digitalSignature,keyEncipherment
extendedKeyUsage = serverAuth,clientAuth
subjectKeyIdentifier = hash
subjectAltName = @alt_names
[alt_names]
DNS.1 = kuma.mycompany.ru
IP.1 = 1.2.3.4
```

Делаем запрос на сертификат:

```bash
openssl req -new -nodes -sha256 -out external.csr -config /root/cert/openssl.cnf -keyout external.key
```

В текущем каталоге будут созданы файлы external.key (файл с закрытым ключом ) и external.csr (файл запроса на сертификат)

Отдаем запрос на сертификат в центр сертификации. От центра сертификации должны получить сертификат сервера и корневой сертификат центра сертификации и все сертификаты промежуточных центров сертификации если они есть.

- Все сертификаты должны быть в формате PEM (BASE64).
- Содержимое сертификатов должно выглядеть - ( -----BEGIN CERTIFICATE----- и -----END CERTIFICATE-----)

Полученные сертификаты необходимо объединить в одну полную цепочку сертификатов в правильном порядке.

```bash
openssl x509 -inform PEM -in server.pem > external.cert
openssl x509 -inform PEM -in subca.pem >> external.cert
openssl x509 -inform PEM -in root.pem >> external.cert
```

<p class="callout info">В файле с сертификатами важен порядок и должнен быть примерно такой: rootca-subca1-subca2-subca3-...</p>

Полученный файл external.cert необходимо проверить на корректность (должен быть вывод списка цепочки сертификатов):

```bash
openssl crl2pkcs7 -nocrl -certfile  external.cert  | openssl pkcs7 -print_certs -noout

openssl verify external.cert
#external.cert: OK
```

Проверяем корректность полученного сертификата и ключа (результат должен совпадать):

```bash
openssl x509 -noout -modulus -in external.cert | openssl md5
#(stdin)= 239994c3bd2a90507a548bf373127e18
openssl rsa -noout -modulus -in external.key | openssl md5
#(stdin)= 239994c3bd2a90507a548bf373127e18
```

### Замена в обычной инсталляции (не кластер ядра)

<p class="callout warning">Перед заменой пары external.cert external.key создайте их резервную копию.</p>

<div id="bkmrk-%D0%92%D0%B7%D1%8F%D1%82%D1%8C-%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82-%D0%BA%D0%BE%D0%BC">Взять сертификат компании (вероятно это будет pfx), но может и другие форматы - например DER.</div><div id="bkmrk--1"></div><div id="bkmrk-%D0%A1%D0%BA%D0%BE%D0%BD%D0%B2%D0%B5%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D0%B5%D0%B3%D0%BE-">Сконвертировать его в ключ и сертификат в формате PEM (BASE64) и положить в папку например, для конвертации из PFX это будут команды ниже.</div><div id="bkmrk--2"></div><div id="bkmrk--3"></div><div id="bkmrk-%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%BB%D1%8E%D1%87%D0%B0-%D0%B8%D0%B7-k">Получение ключа из kumaWebIssuedByCorporateCA.pfx:</div><div id="bkmrk--4"></div>```
openssl pkcs12 -in kumaWebIssuedByCorporateCA.pfx -nocerts -out external.key
```

<div id="bkmrk-%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82">Получение сертификата из kumaWebIssuedByCorporateCA.pfx:</div><div id="bkmrk--5"></div>```
openssl pkcs12 -in kumaWebIssuedByCorporateCA.pfx -nokeys -out external.cert
```

<div id="bkmrk-%28%D0%9E%D0%BF%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%29-%D0%B5%D1%81%D0%BB%D0%B8-%D0%BA">(Опционально) если ключ версии PKCS#1 то его нужно сконвертировать в PKCS#8, это можно сделать соедующей командой:</div>```bash
openssl pkcs8 -in private.key -topk8 -nocrypt -out new_private.key
```

<div id="bkmrk--6"></div><div id="bkmrk-%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5-%D1%84%D0%B0%D0%B9%D0%BB%D1%8B-%D0%BD%D0%B0%D0%B4">Полученные файлы надо положить в папку: </div><div id="bkmrk--7"></div>```
/opt/kaspersky/kuma/core/certificates/
```

<div id="bkmrk-%D0%92%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D1%8C-%D1%81%D0%BC%D0%B5%D0%BD%D1%83-%D0%B2%D0%BB%D0%B0%D0%B4">Выполнить смену владельца этих файлов: </div><div id="bkmrk--8"></div>```
chown kuma:kuma external.cert external.key
```

Перезапустить ядро:

```
systemctl restart kuma-core
```

---

### Замена в оказоустойчивом ядре

1\. На контрольной машине или Control Plane Master получить список подов и найти кору

```
k0s kubectl get pod -A
```

2\. Зайти в шел пода коры и выполнить бэкап сертификатов. (название core-deployment в каждой инсталяции уникально)

```
k0s kubectl exec -n kuma --stdin --tty core-deployment-779f8bf646-djszw -- /bin/bash
```

3\. Скопировать новый сертификат с файловой системы Control Plane Master на под коры, выгрузить сертификат и ключ

```
k0s kubectl cp kuma-poc.pfx -n kuma core-deployment-779f8bf646-djszw:/opt/kaspersky/kuma/core/certificates
```

4\. Найти деплоймент коры

```
k0s kubectl get deployments
```

5\. Выполнить рестарт деплоймента коры

```
k0s kubectl rollout restart deployment -n kuma core-deployment
```