Войти

Библиотека для сборки клиента СМЭВ с расширенными возможностями

1       Внешнее подписание сообщений

Стандартная библиотека подписывала сообщение ЭП-ОВ в момент его отправки в СМЭВ с помощью установленного рядом КриптоПро JCP. В расширенной библиотеке реализована возможность передать для отправки содержимое сообщения и его подпись, а также время формирования (для GetRequestRequest и GetResponseRequest). Это позволяет использовать любой внешний механизм подписания, а также несколько различных подписей одним приложением.

В ru.voskhod.smev.client.api.services.template.WSTemplate добавлены перегруженные методы, содержащие подпись сообщения:

SMEVMessage get(QueryInformation query, Element signature) throws SMEVException;

SMEVMetadata send(SMEVMessage message, Element signature) throws SMEVException;

void ack(SMEVMetadata metadata, boolean accepted, Element signature) throws SMEVException;

В ru.voskhod.smev.client.api.types.message.system.processing.QueryInformation добавлено поле XMLGregorianCalendar timestamp;

Что необходимо для внешнего подписания GetRequestRequest и GetResponseRequest.


Примеры использования: 

  • Получение ответа из очереди (GetResponseRequest)
//ru.voskhod.smev.client.api.util.Utils - класс клиента СМЭВ

XMLGregorianCalendar timestamp = Utils.getNow();

 

//timestamp используется для создания конверта.

//Необходим только если планируется внешнее подписание.

//Если не задать, клиент при сборке сообщения для отправки обновит дату //на текущую и подпись станет невалидной.

QueryInformation queryInformation = QueryInformation(nodeId, namespaceURI, rootElementLocalName, type, timestamp);

//получение конверта для подписания

GetResponseRequest requestRequest = new MessageMapperImpl().createGetResponseRequest(queryInformation);

... подписание запроса

Element xmldSigSignatureType = ...;

 

//отправка запроса

wsTemplate.get(queryInformation, xmldSigSignatureType);

  • Отправка запроса (SendRequestRequest)
//формируем элемент для содержимого MessagePrimaryContent запроса

Element content = ...;

//Формируем запрос

List<Element> businessProcessMetaData = ...;

RequestContent requestContent = new RequestContent(content, personalSign, attachments, businessProcessMetaData);

SMEVMessage smevMessage = new SMEVMessage(smevMetadata, requestContent);

SendRequestRequest requestRequest = new MessageMapperImpl().createSendRequestRequest(smevMessage);

...подписание запроса

Element xmldSigSignatureType = ...;

 

//отправка запроса

wsTemplate.send(smevMessage, xmldSigSignatureType);


2       Получение подписи отправителя из входящего сообщения

Содержимое подписи отправителя SenderInformationSystemSignature в полученном сообщении СМЭВ ранее было недоступно. Добавлена возможность его получить для дальнейшей обработки, например, для визуализации штампа с данными сертификата.

В ru.voskhod.smev.client.api.types.message.system.SmevContext добавлено поле Element senderInformationSystemSignature;

Пример получения:

SMEVMessage response = ... получение сообщения из СМЭВ;

response.getSMEVMetadata().getSmevContext().getSenderInformationSystemSignature(); 

3       Исправление ошибки совпадения имен вложений во временной папке

Ранее вложения сохранялись в одной временной папке. Поэтому при использовании в сообщениях файлов с одинаковыми именами, они перезаписывались в ней. После доработки файлы сохраняются в отдельных подпапках с учетом messageId сообщения.

Путь строится следующим образом:

  • Вложение MTOM - localStorage/messageId/id
  • Вложение на FTP - localStorage/messageId/FileName
где localStorage - путь к временному хранилищу файлов, который указывается при создании ru.voskhod.smev.client.api.template.configuration.WSConfigurationImpl в поле localStorage.

4       Корректная обработка статусных сообщений СМЭВ

Для схем СМЭВ версии 1.1 и 1.2 реализована обработка сообщений с асинхронными статусами обработки (AsyncProcessingStatus/StatusCategory). До доработки при любом статусе возвращалось SMEVMessage.SMEVMetadata.SMEVContext.SMEVStatus.REJECTED. Сейчас результат соответствует содержимому:

 static {
        Map<String, SMEVStatus> mapping = new HashMap<>();
        mapping.put("requestIsQueued", QUEUED);
        mapping.put("responseIsAcceptedBySmev", ACCEPTED);
        mapping.put("requestIsAcceptedBySmev", ACCEPTED);
        mapping.put("cancelled", REJECTED);
        mapping.put("requestIsRejectedBySmev", REJECTED);
        mapping.put("underProcessing", PROCESSING);
        mapping.put("responseIsDelivered", DELIVERED);
        mapping.put("messageIsArchived", ARCHIVED);
        mapping.put("messageIsDelivered", ARCHIVED);
        mapping.put("responseIsRejectedBySmev", REJECTED);
        mapping.put("doesNotExist", UNKNOWN);
        SMEVStatus.mapping = Collections.unmodifiableMap(mapping);
    }


5       Обработка входящих сообщений с вложениями MTOM без подписи

XSD-схема СМЭВ допускает отсутствие подписи у вложений MTOM (элемент AttachmentHeader/SignaturePKCS7). До доработки при попытке получения из очереди СМЭВ сообщения с вложением MTOM без подписи возникал Exception.

6          Корректное сохранение на файловой системе конвертов сообщений с вложениями MTOM

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

Сохранение конвертов включается при создании объекта ru.voskhod.smev.client.api.template.configuration.WSConfigurationImpl, если messageStorage не null (messageStorage содержит путь к папке).

Вложение MTOM из сообщения можно получить с помощью SMEVMessage.getData().getAttachments() (MTOMAttachment, поле content).

В рамках доработки в классе ru.voskhod.smev.client.api.types.message.attachment.MTOMAttachment у поля content тип изменен с DataHandler на byte[].
Авторизуйтесь, чтобы оставить комментарий к статье