Сервис обслуживания ЭП

Сервис обслуживания ЭП — компонент модуля Базовые объекты. Сервис указывает в журнале подписей Web-клиента актуальный статус подписи, тип и дату окончания срока действия сертификата. Сервис обслуживания ЭП может работать в сочетании с Криптосервисом — Docker-контейнером, выполняющим функции обслуживания ЭП.

Для использования криптосервиса ЭП требуется Docker актуальной версии и опция лицензии Docsvision Сервис обслуживания электронной подписи (только для добавления архивного штампа времени). Криптосервис может быть получен из общего реестра образов Docker Hub — docsvision/cryptoservice или реестра образов Docsvision — packages.docsvision.com/cryptoservice.

Функциональные возможности сервиса обслуживания ЭП

Сервис обслуживания ЭП — расширение, входящее в стандартную поставку модуля Базовые объекты, не следует путать его с Криптосервисом. Криптосервис поставляется в виде Docker-контейнера.
Сервис обслуживания подписи:
  • Если срок действия сертификата не истёк, Сервис указывает в карточке актуальный статус подписи, тип и дату окончания срока действия сертификата, даёт возможность просматривать дополнительную информацию о подписи в журнале подписей Web-клиента.

Криптосервис дополняет функции сервиса по обслуживанию следующими возможностями:
  • Если срок действия сертификата не истёк, Криптосервис доступен и функционирует, в карточку добавляется новый архивный штамп времени и улучшает подпись до CAdES-A.

  • В Docsvision версии 6.1 и выше Криптосервис является обязательным для проверки подписей CAdES-BES и CAdES-X Long Type 1 с нестандартными для .NET алгоритмами в сертификатах. Требуется, например, при использовании сертификатов КриптоПро.

  • В Docsvision версии 6.1 и выше Криптосервис также необходим для функционирования Простой подписи.

Из-за использования библиотеки tspcom.dll Криптосервис требует быть развернут минимум в 32-битном процессе Службы рабочих процессов.

Установка и запуск Криптосервиса

Криптосервис работает с Docsvision следующих версий:
  • Модуль "Платформа" версии 6.1 и выше + "Web-клиент" 18 (6.1) и выше.
    Криптосервис является обязательным для проверки подписей с нестандартными для .NET алгоритмами в сертификатах. Требуется, например, при использовании сертификатов КриптоПро.

  • Модуль "Платформа" версии 5.5.5 + "Web-клиент" 17.
    Криптосервис указывает в журнале подписей Web-клиента актуальный статус подписи, тип и дату окончания срока действия сертификата, делает доступной расширенную информацию о подписи.

Криптосервис можно установить и запустить командой:

docker run -d -p 8100:8094 packages.docsvision.com/cryptoservice (1)
1 Если используется Docker Hub, замените packages.docsvision.com/cryptoservice на docsvision/cryptoservice.

Настройки криптосервиса задаются в командной строке.

При запуске контейнера необходимо связать порт хоста с портом контейнера, например, -p 8100:8094. В примере 8100 — порт хоста, 8094 — порт контейнера. Для работы функций проверки и формирования подписи сервер Docsvision должен подключаться к контейнеру через порт хоста. Адрес Криптосервиса указывается в конфигурационном файле, см. подробности ниже.

По умолчанию Криптосервис использует TSP-службу с адресом http://cryptopro.ru/tsp/tsp.srf. При необходимости адрес используемой TSP-службы можно переопределить с помощью переменной окружения TSP_SERVICE_ADDRESS. Ниже приведён пример переопределения адреса TSP-сервиса:

$ docker run -d -p 8100:8094 -e TSP_SERVICE_ADDRESS=http://testca2012.cryptopro.ru/tsp/tsp.srf packages.docsvision.com/cryptoservice

Контейнер поставляется в комплекте со следующими сертификатами:

При необходимости использования дополнительных сертификатов выполните одну из следующих настроек:

  • Укажите путь к папке сертификатов:

    1. Необходимые сертификаты сохраните в отдельную папку на диске Docker-хоста.

    2. Смонтируйте в каталог /var/cryptoservice/cacerts Docker-контейнера и запустите контейнер.
      При запуске контейнера всё содержимое папки будет импортировано в хранилище.

      docker run -d -p 8100:8094 -v ./Cert:/var/cryptoservice/cacerts packages.docsvision.com/cryptoservice (1)
      1 Если используется Docker Hub, замените packages.docsvision.com/cryptoservice на docsvision/cryptoservice.
  • Заново соберите образ:

    1. Создайте Dockerfile:

      FROM packages.docsvision.com/cryptoservice
      COPY ./your/cacerts/ /var/cryptoservice/cacerts/ (1)
      1 Если используется Docker Hub, замените packages.docsvision.com/cryptoservice на docsvision/cryptoservice
    2. Соберите собственный образ:

      $ docker build . -t cryptoservice
    3. Запустите контейнер:

      $ docker run -d -p 8100:8094 cryptoservice

Настройка Криптосервиса в Docsvision 6.1

  1. После установки Криптосервиса создайте файл с расширением .json и любым именем, скопируйте созданный конфигурационный файл по пути /usr/lib/docsvision/platform/config и перезапустите службу dvappserver. Пример содержимого файла .json приведён ниже:

    {
      "DocsVision": {
        "BackOffice": {
          "Server": {
            "Extension": {
              "ComplexSignatureServiceAddress": "ConnectAddress=http://server.domain.com:8100/cryptoservice/api/v1" (1)
            }
          }
        }
      }
    }
    1 Адрес Криптосервиса.
  2. Зайдите в Консоль управления и создайте процесс Службы фоновых операций с типом конфигурации Обслуживание ЭП.

    • Для корректной работы службы фоновых операций с использованием сервиса перештамповки подписей необходимо использовать машину, имеющую как минимум два процессора.

    • Сервис обслуживания ЭП должен запускаться только в одном экземпляре рабочего процесса Службы фоновых операций.

  3. В соединении Docsvision выберите сервер, на котором указан адрес Криптосервиса в конфигурационном файле из примера выше.

События работы сервиса записываются в журнал Криптосервиса. Ознакомиться с журналом можно, имея идентификатор контейнера:

sudo docker ps (1)
sudo docker logs идентификатор-контейнера (2)
1 Узнать идентификатор контейнера.
2 Посмотреть журнал Криптосервиса.

Улучшение подписи с сертификатом без адреса OCSP сервиса

При улучшении подписи, созданной с помощью сертификата без адреса OCSP сервиса, могут возникать ошибки вида: The signer certificate <…​> must have OCSP evidence but it doesn’t contain any OCSP reference. OCSP evidence is not created.

Исправить ситуацию можно, если известен адрес OCSP сервиса, выдавшего сертификат.

Требования к сертификату:
  • Сертификат, которым выполнялась подпись, должен быть доверенным. Доверенный сертификат — это сертификат, у которого корневой и промежуточные сертификаты добавлены в доверенные в образе Крипто-сервиса.

  • Сертификат OCSP сервиса (для подписания ответов сервиса) должен быть доверенным. Сертификат с большой вероятностью будет недоверенным в случае, если используется неквалифицированная электронная подпись (НЭП).

  • Сертификат OCSP сервиса должен быть выпущен тем же УЦ, что и сертификат, которым выполнялась подпись (поле Issuer в сертификатах должно совпадать). Иными словами, нужно использовать OCSP сервис того же УЦ, который выпустил сертификат, которым выполнялась подпись. Только данный УЦ может контролировать статус отзыва сертификата.

  • Сертификат OCSP сервиса можно уточнить в УЦ.

  • Сертификат TSP сервиса также должен быть доверенным.

  • Получить сертификат TSP сервиса можно также через техподдержку компании, которая предоставляет сервис, либо через утилиту CryptExpert.

Когда адрес сервиса известен, необходимо в файле настроек криптосервиса /etc/cryptoservice/settings.json указать актуальные адреса OCSP серверов следующим образом:

{
    "ocspSettings": [
        {
            "ocspUrl": "http://ocsp-service.ru/ocspn/ocsp.srf", (1)
            "serial": "17192b01038046a1649b8a076964699c4" (2)
        },
        {
            "ocspUrl": "http://ocsp-service.example.ru/ocspn1000000/ocsp.srf",
            "serial": "1f409aa452fd10ee11500ea83ca0f3ce2"
        }
    ]
}
1 "ocspUrl" — адрес OCSP сервиса.
2 "serial" — серийный номер корневого сертификата улучшаемой подписи.

Конфигурационный файл settings.json должен располагаться в контейнере криптосервиса по пути /etc/cryptoservice/. Если в файле задана хотя бы одна группа настроек ocspSettings, то при улучшении подписи криптосервис будет проверять цепочку родительских сертификатов сертификата улучшаемой подписи.

Серийные номера сертификатов сопоставляются с номером, указанным в конфигурационном файле, при совпадении заданный адрес OCSP будет использоваться для самого близкого родительского сертификата. Чтобы серийный номер сертификата считывался успешно, поместите его в каталог конревных сертификатов /var/cryptoservice/cacerts.

Контейнер криптосервиса можно сразу смонтировать вместе с файлом настроек OCSP сервиса следующим образом:

$ docker run -d -p 8100:8094 -v /path/to/settings.json:/etc/cryptoservice/settings.json packages.docsvision.com/cryptoservice

Настройка подключения к криптосервису по HTTPS

  1. Создайте PKCS12-файл (.p12 или .pfx) предпочтительным способом. Шаг можно пропустить, если уже есть сертификат в формате .p12 или .pfx. Ниже приведён пример генерации файла при помощи утилиты OpenSSL.

    openssl pkcs12 -export \
    -in fullchain.pem \ (1)
    -inkey privkey.pem \ (2)
    -out keystore.p12 \ (3)
    -passout pass:MyP@ssw0rd (4)
    1 Промежуточный и конечный сертификат
    2 Приватный ключ
    3 Имя выходного PKCS12-файла
    4 Пароль для защиты PKCS12-файла
  2. Создайте файл конфигурации.

    cat > application.properties <<EOF
    server.ssl.key-store=/keystore.p12 (1)
    server.ssl.key-store-password=MyP@ssw0rd (2)
    server.ssl.keyStoreType=PKCS12
    EOF
    1 Путь до PKCS12-файла в контейнере
    2 Пароль от PKCS12-файла
  3. Запустите криптосервис:

    docker run -d -p 8100:8094 \
    -v $(realpath application.properties):/application.properties \ (1)
    -v $(realpath keystore.p12):/keystore.p12 \ (2)
    packages.docsvision.com/cryptoservice \
    java org.springframework.boot.loader.JarLauncher \
    --spring.config.additional-location=/application.properties (3)
    1 Монтирование файла конфигурации хост:контейнер
    2 Монтирование PKCS12-файла хост:контейнер
    3 Путь до файла конфигурации в контейнере