HTTPS-сертификаты корпоративного УЦ#

При использовании в компании HTTPS на базе сертификатов, выпущенных корпоративным удостоверяющим центром (УЦ), необходимо добавить корневые сертификаты УЦ в контейнеры. Если этого не сделать, будут возникать проблемы при сетевом взаимодействии с HTTPS-сервисами, так как сертификаты УЦ отсутствуют в списке доверенных сертификатов контейнеров.

Ниже приведены шаги по добавлению сертификата УЦ в контейнеры NextGIS. Их необходимо выполнить на сервере, где развернуто ПО NextGIS (NextGIS Web, GeoServices), в директории, где находится файл docker-compose.yaml (обычно это /srv/ngwdocker для NextGIS Web и /srv/geoservices для NextGIS GeoServices). Для этого потребуется:

  • Сертификат УЦ в формате PEM (обычно с расширением .crt или .pem).

  • Утилиты openssl и curl (обычно установлены по умолчанию).

Шаг 1. Убедитесь, что ваш CA-сертификат находится в формате PEM. Для проверки выполните команду:

openssl x509 -in путь/к/сертификату -noout -inform PEM -subject

Если команда успешно выполнилась и вывела информацию о сертификате, значит сертификат имеет корректный формат. В случае ошибки вы увидите сообщение «Could not find certificate from путь/к/сертификату». Запомните значение, указанное после CN=, оно понадобится вам далее.

Шаг 2. Скопируйте существующий список доверенных сертификатов из контейнера. Для этого выполните команду:

docker compose cp app:/etc/ssl/certs/ca-certificates.crt ca-certificates.crt

В результате будет создан локальный файл ca-certificates.crt, содержащий список доверенных сертификатов контейнера.

Шаг 3. Добавьте ваш CA-сертификат в файл ca-certificates.crt. Для этого выполните команду:

cat путь/к/сертификату >> ca-certificates.crt

Если сертификатов несколько, выполните эту команду для каждого из них.

Шаг 4. Проверьте, что сертификат был добавлен в список доверенных сертификатов корректно. Для этого выполните следующую команду, подставив в команду значение CN, которое вы получили на шаге 1:

openssl crl2pkcs7 -nocrl -certfile ca-certificates.crt | \
   openssl pkcs7 -print_certs -noout | \
   grep "<CN из шага 1>"

В случае успеха вы должны увидеть такую же запись, как и в первом пункте.

Шаг 5. Проверьте, что сертификат работает корректно при установлении HTTPS-соединения. Для этого вам потребуется адрес HTTPS-сервиса, который использует сертификат, выданный вашим УЦ. Выполните команду:

curl -v --cacert ca-certificates.crt https://адрес-с-вашим-ca/

Если соединение устанавливается без ошибок проверки сертификата, значит сертификат добавлен корректно.

Шаг 6. Подключите полученный файл в контейнер app. Для этого откройте файл docker-compose.yaml в текстовом редакторе и добавьте в секцию volumes сервиса app следующую запись:

- { type: bind, source: ca-certificates.crt, target: /etc/ssl/certs/ca-certificates.crt }

Например, для NextGIS Web у вас должно получиться следующее:

# ...
services:
  app:
    volumes:
      - { type: volume, source: data_app, target: /opt/ngw/data/app }
      - { type: volume, source: config_app, target: /opt/ngw/config/app }
      - { type: volume, source: secret, target: /opt/ngw/secret }
      - { type: volume, source: backup, target: /opt/ngw/backup }
      - { type: bind, source: ca-certificates.crt, target: /etc/ssl/certs/ca-certificates.crt }
# ...

Шаг 7. Перезапустите контейнеры для применения изменений. Для этого выполните команду:

docker compose down
docker compose up -d

Шаг 8. Проверьте, что сертификат работает корректно внутри контейнера, для этого подключитесь к контейнеру app:

docker compose exec app /bin/bash

Выполните команды для проверки наличия сертификата и установления HTTPS-соединения внутри контейнера:

openssl crl2pkcs7 -nocrl -certfile /etc/ssl/certs/ca-certificates.crt | \
    openssl pkcs7 -print_certs -noout | \
    grep "<CN из шага 1>"

curl -v https://адрес-с-вашим-ca/

Если запрос выполняется успешно и не возникает ошибок проверки сертификата, значит всё было сделано правильно. Для выхода из контейнера выполните используйте команду exit или нажмите Ctrl+D.