Настройка взаимодействия с NATS по TLS
Опубликовано Илья Харченко on 2024-02-28 17:56

Внимание: Сертификаты необходимо выпускать строго на технологическом УЦ. Использовать 1 набор TLS сертификатов для аккредитованного и технологического УЦ нельзя!!! Также необходимо разделять DN для клиентских сертификатов, используемых в NATS TLS в технологическом УЦ и аккредитованном!

Предпологается что перед выпусом данных сертификатов, уже настроен технологический УЦ, в конфигурации c NATS без TLS.

 Последовательность действий

  •          Выпустить корректные сертификаты, установить их с привязкой к ЗК (если серверов несколько то устанавливать сертификат необходимо на сервере где физически располагается соответствующий компонент УЦ)
  •          Прописать данные сертификатов в конфиг файле nats.conf
  •          Отредактировать файлы appsettings.json  для сервисов, внеся в них отпечатки сертификатов + включив TLS.
  •          Перезапустить УЦ уже с использованием TLS 

Список сертификатов для NATS TLS

1)      Серверный сертификат NATS, выпускается по шаблону TLS сервер и должен содержать в CN или в SAN DNS имя машины/IP адрес.

2)      Клиентский сертификат пользователя stan, выпускается по шаблону USER,   

3)      Клиентский сертификат пользователя ca, выпускается по шаблону USER,    его отпечаток мы потом пропишем в  Ca.Service/appsettings.json

4)      Клиентский сертификат пользователя ra, выпускается по шаблону USER,   его отпечаток мы потом пропишем в  Ra.Service/appsettings.json + Ra.Web/appsettings.json

5)      Клиентский сертификат пользователя certRegistry , выпускается по шаблону USER,   его отпечаток мы потом пропишем в  certRegistry.Service/appsettings.json + certRegistry.Web/appsettings.json

6)      Клиентский сертификат пользователя pkica выпускается по шаблону USER,     его отпечаток мы потом пропишем в  /pkica/appsettings.json

 Создание запроса на сертификат рекомендуем производить на машине, на которой непосредственно располагается соответствующий компонент УЦ, чтобы избежать в дальнейшем процедуры переноса ЗК.

Создание запроса и выпуск сертификатов могут выполнены как через веб интерфейс, так и с помощью утилиты pkica

Важно: для технологического УЦ,  чтобы разрешить выпуск не только квалифицированных сертификатов правим настройки ЦС 
Надо настройке QualifiedCertMode установить значение AttrFormat или None, Затем перезапустить службу ЦС.

Процедура подробно описана в  пункте 1.2.6. Руководства по эксплуатации.

 

Выпуск сертификатов:

Пример команд для выпуска сертификата, указаного пункте 1 списка сертификатов с ипользованием pkica

Создаем запрос:

pkica ca new-cert-req -o<путь к файлу запроса на сертификат> -t 1.2.643.2.2.46.0.3 -s "CN=<DNSимя машины>" -c<Имя контейнера ЗК> --no-pin -k KeyExchange

Если Вы хотите добавить несколько DNS имен в SAN то запрос создание запроса должно выглядеть так:

pkica ca new-cert-req -o<путь к файлу запроса на сертификат> -t 1.2.643.2.2.46.0.3 -s 'CN=Вебсервер,1.2.643.2.2.44.5="<DnsName1>;<DnsName2>;<DnsName3>"' -c<Имя контейнера ЗК> --no-pin -k KeyExchange

Выпускаем сертификат

/opt/cpca/pkica/pkica ca issue-cert -f  <путь к файлу запроса на сертификат> -n <Имя ЦС> -o <путь к файлу сертификата>

Устанавливаем сертификат с привязкой к ЗК(обязательно под тем-же пользователем под которым создавали запрос)

/opt/cprocsp/bin/amd64/certmgr -install -file <путь к сертификату> -container <Имя контейнера ЗК>  -store uMy –certificate

Пример выпуска сертификата, указаного пункте 1 списка сертификатов с ипользованием веб интерфейса

Создаем пользователя и выпускаем ему сертификат, по шаблону Сервер TLS, не забывая указать верные SAN

Затем создаем pfx и устанавливаем его на УЦ под тем пользователем, под которым запускается демон Nats. 

Важно: при установке pfx не задаем пароль.

sudo -u <имя пользователя> /opt/cprocsp/bin/amd64/certmgr -inst -pfx -pin <пин код> -file <путь к файлу>

Для сертификатов, описанных в пунктах 2-6 списка сертификатов, отличаться будет только процедура создания запроса, мы будем использовать другой шаблон и для каждого пункта указывать свой уникальный DN. Процесс выпуска и установки отличаться не будет.

Важно: Данные DN должны быть уникальны для каждого сертификата (2-6) и их необходимо будет указать в разделе users,  nats.conf(пример данного раздела будет приведен ниже) желательно не добавлять много компонентов имени, чтобы не переусложнить конфиг. Так-же не должно быть компонентов: ИНН\ИНН ЮЛ\СНИЛ\ОГРН.\ОГРНИП

 

Пример команд для создания запроса на сертификат,  описанных в пунктах 2-6 списка сертификатов

pkica  ca new-cert-req -t 1.2.643.2.2.46.0.6 -s "CN=stan,C=RU" -c <Имя контейнера ЗК>  -e -k  KeyExchange  -o   <путь к файлу запроса на сертификат>

 

Пример выпуска сертификатов, указаных пункте 2-6 списка сертификатов с ипользованием веб интерфейса

Создаем пользователя и выпускаем ему сертификат, по шаблону Клиент TLS

Затем создаем pfx и устанавливаем его на УЦ под тем пользователем, под которым запускается демон соответсвующего сервиса. 

Важно: при установке pfx не задаем пароль.

sudo -u <имя пользователя> /opt/cprocsp/bin/amd64/certmgr -inst -pfx -pin <пин код> -file <путь к файлу>

Редактируем файл nats.conf:

Сертификаты, описанные в пунктах 1 и 2, указываются в виде пути к файлу сертификата (путь прописан 2 раза –это нормально, так и нужно прописывать) в следующих разделах

Для серверного сертификата (описан в пункте 1 списка сертификатов), путь указывается в данном разделе:

tls: {

  # серверныйсертификат NATS

  cert_file:      "/opt/cpca/nats-streaming/ssl/nats-server.cer"

  key_file:       "/opt/cpca/nats-streaming/ssl/nats-server.cer"

  verify_and_map: true

}

Для клиентского сертификата (описан в пункте 2 списка сертификатов), путь указывается в данном разделе:

# NATS Streaming Configuration

streaming: {

  cluster_id: pkica-cluster

 

  tls: {

    # клиентский сертификат NATS Streaming для подключения к сервису NATS

    client_cert: "/opt/cpca/nats-streaming/ssl/nats-client.cer"

    client_key:  "/opt/cpca/nats-streaming/ssl/nats-client.cer"

  }

}

корректный DN клиентского сертификата также должен быть прописан в разделе users, что будет рассмотрено ниже

 

Для сертификатов указанных в пунктах 2-6 списка сертификатов, необходимо прописать их DN в разделе users файла nats.conf

По умолчанию данный раздел выглядит так:

users = [

     {user: "CN=stan,C=RU", permissions: $stan_permissions}

     {user: "CN=ca,C=RU", permissions: $ca_permissions}

     {user: "CN=ra,C=RU", permissions: $ra_permissions}

     {user: "CN=certRegistry,C=RU", permissions: $certRegistry_permissions}

     {user: "CN=pkica,C=RU", permissions: $pkica_permissions}

  ]

 

Не забываем добавить корректный порт и DNS имя (Именно DNS имя, а не IP) в раздел listen

 

Правим файлы  appsettings.json

Теперь в файлах appsettings.json соответствующих сервисов, в разделах NATS/STAN задаем отпечаток соответствующего им tlsсертификата(смотри список сертификатов) и выставляем значение параметра "Secure": true. Не забываем что в разделе URL должно быть указано DNS имя а не IP 

Пример: 

"Nats": {
"Url": "nats://testuc:4222",
// настройки TLS
"Secure": true, // включить TLS
"Thumbprint": "89afdf6aaf47b23d9d19e63c280daf1b6c8b6e80", // отпечаток клиентского сертификата
"StoreLocation": "CurrentUser" // "LocalMachine"
},

"Stan": {
"Url": "nats://testuc:4222",
"ClusterID": "pkica-cluster",
"ClientID": "ca-service",
// настройки TLS
"Secure": true, // включить TLS
"Thumbprint": "89afdf6aaf47b23d9d19e63c280daf1b6c8b6e80", // отпечаток клиентского сертификата
"StoreLocation": "CurrentUser" // "LocalMachine"
},

 

Запускаем сервисы

После правки необходимых конфигов. необходимо остановить демоны сервисов УЦ(или процессы если запущено вручную)

Производим пробный запуск NATS c TLS через bash

Пример /opt/cpca_tls/nats-streaming/nats-streaming-server -sc /opt/cpca_tls/nats-streaming/nats.conf

Убеждаемся, что Nats успешно запустился -завершаем процесс

 

Если ранее для NATS без TLS был создан демон, необходимо отредактировать его настройки, указав путь к новому файлу конфигурации.

Так-же можно создать новый демон, отключив автозагрузку "старого"

 

Запускаем демоны сервисов УЦ, проверяя что соединение успешно установилось 

 

Важно: После того как мы включим TLS для NATS, через pkica нельзя будет выпускать сертификаты с неподписанными запросами.

Подписать запрос необходимо сертификатом оператора.

Пример подписи с использование cryptcp:

cryptcp -sign -thumbprintDF861BEA1B3066A99B77A1D39FC1B804A718FCDB -der <путь к файлу запроса> <путь к подписанному файлу>

 

 


Что если в конфигурации с NATS TLS по какой либо причине не смог выпуститься CRL, а предыдущий уже истек?

В такой ситуации новый crl не сможет выпуститься т.к. не построится TLS между компонентами 

Необходимо выполнить следующие действия:

 

Необходимо остановить демоны сервисов УЦ+ Nats(или процессы если запущено вручную) 

Через bash выполняем команду ручного запуска Nats c конфигом nats.no-tls.conf 

 nats-streaming-server -sc /opt/cpca/nats-streaming/nats.no-tls.conf

Послеуспешногозапуска NATS, правимфайл appsettings.json в   CryptoPro.Ca.Service, убирая требование Secure

Также правим appsettings.json в  pkica тем же образом 

 

через bash запускаем исполняемый файл CryptoPro.Ca.Service

 

Затем загружаем ключи (при необходимости) и вручную выпускаем CRL, указывая директорию публикации

pkica ca crl issue --name <имя цс>  --output-folder  <директория публикации CRL> 

 

После успешного выпуска crl, распространяем его на все компоненты УЦ.

Останавливаем CryptoPro.Ca.Service и Nats

Включаем в файлах конфигурации appsettings.json требование Secure

Последовательно запускаем Nats c TLS и остальные демоны УЦ

 

(5 плюсик(ов))
Класс!
Не очень :(

Коментарии (0)