- Анализ исходных данных
- Как выглядит документ, подписанный в криптопро
- Как подписать pdf с помощью эцп
- Как подписать доверенность с помощью эцп
- Как подписать договор с помощью эцп
- Как подписать документ excel с помощью эцп
- Как подписать документ word с помощью эцп
- Как подписать файл с помощью эцп
- Отсутствие сертификата в системе
- Ошибка генерации конечного файла
- Подготовка к подписи по правилам смэв 3
- Подпись сообщений смэв 3
- Проблемы. хэш не совпадает
- Проверка подписи сообщения смэв 3
- Программные требования
- Разрешается ли редактирование файла подписанного эцп
- Распространенные ошибки при подписи документов
- Результаты
- Требования:
- Цифровая подпись cades-bes для xml средствами 1с с помощью криптопро
Анализ исходных данных
Загружаем с портала СМЭВ 3:
Если уже умеем формировать обычный XMLDSig или подписывать, например, конверты сообщений СМЭВ 2, то больше всего начинает интересовать, чем же отличается конверт с подписью СМЭВ 3 от СМЭВ 2.
Открываем пример конверта СМЭВ 3 SendRequestRequestNoAttach.xml
Как выглядит документ, подписанный в криптопро
Визуально заметить какие-либо отличия не получится. А узнать о наличии электронной подписи можно в «Свойствах» файла (во вкладке «Подробно» можно получить всю интересующую информацию на этот счет).
Если же подпись добавлена как «открепленная», то рядом с подписанным файлом появится сам электронный сертификат (открытый) с расширением .sig. Дважды кликнув на данный файл можно получить подробную информацию об использованной электронной подписи (а также о владельце ЭЦП).
О наличии подписи также уведомляет сама операционная система при открытии подписанного файла. Но это работает только с текстовыми файлами, а также с PDF-документами (при открытии файла через Adobe Acrobat или Adobe Reader).
Как подписать pdf с помощью эцп
Если Вам необходимо подписать документ например для налоговой, читайте инструкцию выше «Как подписать файл с помощью ЭЦП», если же Вам необходима подпись с видимой частью в документе, то читайте инструкцию ниже.
Для того чтобы подписать pdf документ с помощью ЭЦП необходимо ПО КриптоПро PDF.
Плюсы: Электронная подпись видна в документе.
Минусы: Стоимость программы (90 дней бесплатно.)
также, необходимо чтобы был установлен Acrobat Reader DC или Adobe Acrobat Pro.
Прежде чем вставить электронную подпись в документе pdf, необходимо настроить Acrobat Reader DC для работы с программой КриптоПро PDF, для этого в Acrobat Reader DC нажимаем Ctrl K или заходим в меню Редактирование -> Установки, в категориях выбираем Подписи -> где «Создание и оформление» нажимаем Подробнее см. рисунок:
В «Методе подписания по умолчанию» выбираем КриптоПро PDF как на рисунке:
Подписываем документ pdf с ЭЦП
Открываем документ pdf -> в правой панели нажимаем на заполнить и подписать
В верхней панели программы Acrobat Reader нажимаем на «Заполнить и подписать» -> «Дополнительные инструменты»
Необходимо выбрать инструмент Сертификаты для добавления на панель.
После нажатие на Сертификаты на панели появиться инструмент «Поставить цифровую подпись», нажимаем на нее, далее выделяем курсором участок где хотим поставить цифровую подпись, появиться окно с выбором сертификата.
Выберите сертификат -> ОК -> Подписать.
Цифровая подпись в pdf выглядет вот таким образом:
Наш документ pdf подписан, таким же способом можно поставить несколько подписей в одном файле pdf.
Как подписать доверенность с помощью эцп
Прочитайте выше статью и выберите подходящий вариант как подписать доверенность с помощью ЭЦП.
Вопросы:
Как подписать договор с помощью эцп
В зависимости в каком формате создан договор, прочитайте выше статью Как подписать документ Word или PDF.
Как подписать документ excel с помощью эцп
Не буду повторяться, для того чтобы подписать документ Excel c помощью ЭЦП, необходимо проделать все тоже самое что и для Word см, чуть выше.
Внимание: Если Вам необходимо подписать документ excel с видимой частью подписи в документе, то читайте инструкцию дальше «Как подписать документ Word с помощью ЭЦП» , если же Вам необходимо подписать документ excel и отправить например в налоговую, то Вам подойдет инструкция в начале страницы «Как подписать файл с помощью ЭЦП».
Как подписать документ word с помощью эцп
Если Вам необходимо подписать документ с видимой частью подписи в документе, то читайте инструкцию ниже, если же Вам необходимо подписать документ word и отправить например в налоговую, то Вам подойдет инструкция выше «Как подписать файл с помощью ЭЦП».
Для того чтобы подписать документ Word с помощью ЭЦП нам необходима программа КриптоПро Office Signature.
КриптоПро Office Signature — платное программное обеспечение, служит для подписания документов Wort, Excel.
После установки можно сразу приступить к подписанию документов Word ЭЦП, для этого открываем документ Word который необходимо подписать с ЭЦП -> меню Ставка -> в блоке Текст нажать на Строка подписи и выбрать Строка подписи (КРИПТО-ПРО).
Предположим, что необходимо вставить две электронные подписи в документ Word, для этого проделываем два раза операцию показанную выше, без подписания. Так как после подписания одной подписью, документ станет не редактируемым. Поэтому вставляем два поля для электронной подписи.
После этого можно подписывать нажав на одну подпись, выбрать ЭЦП и подписать, далее такие же действия произвести и со второй подписью.
Подписанный ЭЦП документ word выглядит вот так:
Как подписать файл с помощью эцп
Есть две программы с помощью которых можно подписать файл с помощью ЭЦП:
- ViPNet CryptoFile;
- КриптоАРМ.
ViPNet CryptoFile
Отсутствие сертификата в системе
А вот если на экране выбора сертификата отсутствует необходимый, то, вероятней всего, ранее ЭЦП неправильно была добавлена в систему (в список «Корневых сертификатов») или же не был добавлен сертификат удостоверяющего центра. Для устранения большинства указанных ошибок можно обратиться к программе КриптоПРО CSP из «Панели управления» — при наличии подобных проблем она проинформирует пользователя (встроенная функция проверки соответствий).
Ещё нередко проблемы с подписанием файлов возникают при использовании ОС, в которых не установлены последние патчи безопасности. Соответственно, предварительно рекомендуется провести обновление системы. Например, в Windows 7 обязательно должен быть установлен пакет SP1 – без него КриптоАРМ попросту не будет нормально работать и при попытке запуска выдаст ошибку.
Ошибка генерации конечного файла
Ошибка генерации конечного файла (на этапе завершения работы мастера «Создание ЭП» в КриптоАРМ) может возникать по следующим причинам:
- производится попытка подписать заархивированный файл;
- попытка подписать файл, доступный только для чтения (установлена соответствующая настройка в свойствах файла);
- используется несовместимая (устаревшая) версия КриптоПРО;
- используется несовместимая операционная система (например, Windows 2000 или Windows XP без сервисного пакета SP3);
- ошибка генерации открытого ключа электронной подписи (указывает на то, что ранее подпись была неверно добавлена в систему или же в ней отсутствует сертификат удостоверяющего центра).
Подготовка к подписи по правилам смэв 3
Apache Santuario изначально ничего не знает про ГОСТ криптографические алгоритмы и СКЗИ КриптоПро.
В библиотеке xmlsec-1.5.0.jar в файле orgapachexmlsecurityresourceconfig.xml содержатся настройки только для работы с зарубежными криптографическими алгоритмами.
Чтобы он начал распознавать и применять ГОСТ, нужно выполнить его инициализацию.
По старинке это делалось так:
//APACHE-SANTUARIO INIT WITH CryptoPro JCP
System.setProperty("org.apache.xml.security.resource.config", "resource/jcp.xml");
org.apache.xml.security.Init.init();
String cfile1 = System.getProperty("org.apache.xml.security.resource.config");
LOGGER.log(Level.INFO, "Init class URL: " org.apache.xml.security.Init.class.getProtectionDomain().getCodeSource().getLocation());
LOGGER.log(Level.INFO, cfile1);
В новых версиях КриптоПро JCP (JCSP) инициализацию выполнит одна строчка:
ru.CryptoPro.JCPxml.xmldsig.JCPXMLDSigInit.init();
Теперь нужно Apache Santuario научить новым правилам трансформации, которые диктует СМЭВ 3. Для этого регистрируем класс трансформации:
try {
Transform.register(SmevTransformSpi.ALGORITHM_URN, SmevTransformSpi.class.getName());
santuarioIgnoreLineBreaks(true);
LOGGER.log(Level.INFO, "SmevTransformSpi has been initialized");
} catch (AlgorithmAlreadyRegisteredException e) {
LOGGER.log(Level.INFO, "SmevTransformSpi Algorithm already registered: " e.getMessage());
}
Заодно сразу выполняем требование из Методических указаний:
Требования к форматированию В XML-структуре подписи между элементами не допускается наличие текстовых узлов, в том числе переводов строки.
santuarioIgnoreLineBreaks(true);
private static final String IGNORE_LINE_BREAKS_FIELD = "ignoreLineBreaks";
/**
* Apache Santuario privileged switch IgnoreLineBreaks property
*
* @param mode
*/
private void santuarioIgnoreLineBreaks(Boolean mode) {
try {
Boolean currMode = mode;
AccessController.doPrivileged(new PrivilegedExceptionAction<Boolean>() {
public Boolean run() throws Exception {
Field f = XMLUtils.class.getDeclaredField(IGNORE_LINE_BREAKS_FIELD);
f.setAccessible(true);
f.set(null, currMode);
return false;
}
});
} catch (Exception e) {
LOGGER.warning("santuarioIgnoreLineBreaks " ExceptionUtils.getFullStackTrace(e));
}
}
Делается это в привилегированном блоке AccessController.doPrivileged
и через reflection, из-за особенности реализации свойства ignoreLineBreaks в Santuario.
Просто через настройку системного свойства:
System.setProperty("org.apache.xml.security.ignoreLineBreaks", "true");
не работает.
Через настройку опции JVM:
-Dcom.sun.org.apache.xml.internal.security.ignoreLineBreaks=true
работает.
Если взглянуть на код класса org.apache.xml.security.utils.XMLUtils, то можно увидеть, что поле ignoreLineBreaks статическое, инициализируется в привилегированном блоке из системного свойства «org.apache.xml.security.ignoreLineBreaks».
private static boolean ignoreLineBreaks =
AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
public Boolean run() {
return Boolean.valueOf(Boolean.getBoolean
("org.apache.xml.security.ignoreLineBreaks"));
}
}).booleanValue();
public static boolean ignoreLineBreaks() {
return ignoreLineBreaks;
}
Такая реализация приводит к невозможности гибко настроить в одном Java процессе для части методов игнорировать перевод строк, а для другой части не игнорировать.
Т.е., если одно приложение выполняет подписи XMLDsig, СМЭВ 2 и СМЭВ 3, все XML документы, обработанные Santuario должны на выходе лишиться перевода строк.
С этим свойством, конечно, возникает вопрос к Apache Santuario:
Подпись сообщений смэв 3
Для подписи документов СМЭВ 3 все готово.
Код подписания выглядит следующим образом:
Проблемы. хэш не совпадает
Внимание!
Для отладки использовался пример конверта СМЭВ 3 SendRequestRequestNoAttach.xmlИз него был удален элемент ds:Signature с целью подписать сообщение заново и сверить с оригиналом.
Несмотря на то, что метод подписи и трансформация SmevTransformSpi, взятая из Методических указаний, отрабатывали, на выходе был подписанный документ, подпись которого при онлайн-проверке на портале СМЭВ 3 трактовалась как
ЭП-ОВ не подтверждена: Ошибка проверки ЭП: Нарушена целостность ЭП
Почему
не совпадал с оригинальным примером:
Для диагностики причин в класс SmevTransformSpi в метод process был добавлен свой XMLEventWriter.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
XMLEventWriter bdst =
outputFactory.get().createXMLEventWriter(baos, ENCODING_UTF_8);
для параллельного анализа всех этапов трансформации.
Нормализованный элемент XML, на который требуется поставить подпись, выглядел следующим образом:
Поиск решения показал, что, во-первых
, нормализованный документ может выглядеть на самом деле иначе и соответственно его хэш будет другой и возможно правильный.
Во-вторых, привел в GitHub, где был выложен класс SmevTransformSpi более старой версии.
Старая версия класса трансформации выдала следующий нормализованный документ:
С ним хэш стал совпадать, а подпись успешно проходить валидацию.
Сравнение версий класса SmevTransformSpi показала, что помимо добавленных в новой реализации дополнительных функций логирования и диагностики в debug режиме:
if (logger.isDebugEnabled()) {
debugStream = new DebugOutputStream(argDst);
dst = outputFactory.get().createXMLEventWriter(debugStream, ENCODING_UTF_8);
} else {
dst = outputFactory.get().createXMLEventWriter(argDst, ENCODING_UTF_8);
}
Класс из Методических указаний не содержит нужную строчку, или содержит опечатку:
Отсутствует строка:
prefixMappingStack.pop();
, которая удаляет первый объект из стека с префиксами
Stack<List<Namespace>> prefixMappingStack = new Stack<List<Namespace>>();
, что приводило к неверной работе SmevTransformSpi.
Добавление этой строки в новую версию SmevTransformSpi.java решило проблему.
Проверка подписи сообщения смэв 3
Код проверки подписи выглядит следующим образом:
Программные требования
Перед тем как подписать файл с помощью ЭЦП КриптоПРО нужно удостовериться, что на ПК, где выполняется данная операция, установлено все необходимое программное обеспечение.
Что касательно совместимых операционных систем, то сейчас поддерживаются следующие:
- Windows 7 или более новая (работает и в Windows XP SP3, но официально данная ОС уже не поддерживается разработчиком КриптоПРО из-за проблем с безопасностью данной ОС);
- Ubuntu 14.04 или новее (а также остальные дистрибутивы со схожим набором ПО и ядра Linux, на базе пакетных менеджеров .rpm и .deb);
- MacOS актуальной версии.
Разрешается ли редактирование файла подписанного эцп
— Нет, после подписания файл отредактировать не получиться, например, если попытаться отредактировать текст подписанный в Word-е, то все подписи удаляются.
Распространенные ошибки при подписи документов
Чаще всего у пользователей при попытке подписать файл электронной подписью КриптоПРО возникают проблемы либо с ошибкой генерации конечного файла, либо с отсутствием в системе самого сертификата.
Результаты
Подписание конвертов СМЭВ 3 выполняется успешно.
Сообщения проходят проверку на портале Электронного правительства Госуслуги
И в собственном приложении:
Требования:
Windows 2000/XP/2003/Vista/2008/7: Необходимо Windows 2000 SP4 или старше с Internet Explorer 6.0 или старше. Необходим MSXML 5.0.
Цифровая подпись cades-bes для xml средствами 1с с помощью криптопро
Для работы с ГИС ЖКХ из 1С через API понадобилось выполнять цифровую подпись. Поначалу использовался OpenSSL Python вот отсюда. Там сама подпись и контрольные суммы генерируются с помощью OpenSSL, а скрипт вставляет в исходный XML необходимые узлы.
Во-первых, все это работает через консоль, что не очень быстро. Во-вторых, OpenSSL принимает закрытый ключ в открытом PEM формате, что само по себе безобразие. В-третьих, с переходом на ГОСТ 2022 все это стало невозможно, поскольку инструментов извлечения закрытого ключа в формате PEM из сертификата, выполненного по ГОСТ 2022 не нашлось.
Штатный менеджер криптографии 1С помочь не может, так как подписывать XML не умеет, может только вернуть подпись для потока данных в формате CMS (базируется на PKCS#7), а необходима только сигнатура, длиной в 64 байта.
В итоге пришлось написать обработку, которая выполняет то же самое, что выполнял скрипт на Python.
Обработка подписывает стандартный SOAP-конверт <envelope>, для примера в ней есть тестовый запрос. Разумеется, для подписи в системе должен стоять КриптоПро, к нему должен быть подцеплен сертификат. Пробную версию КриптоПро можно скачать и установить бесплатно на официальном сайте. Тестовый сертификат можно выпустить там же, в тестовом удостоверяющем центре.
Для получения сигнатуры и хеша используется COM-объект «CAdESCOM», поставляемый вместе с КриптоПро. Менеджер криптографии 1С используется для получения данных сертификата — издателя и открытого ключа. Можно было бы обойтись без него, но с ним удобнее. Кроме того, используется COM-объект «System.Text.UTF8Encoding» для конвертации строки в массив байт COMSafeArray в кодировке UTF8. К сожалению, на выходе у XML полностью теряется форматирование. Избежать этого не получилось, так как оно уничтожается при каноникализации средствами 1С. Обратно возвращать форматирование уже нельзя, подпись становится невалидной.
Методика не привязана к конкретному прикладному решению и работает как на сервере, так и на клиенте. Тестировалось на релизе 8.3.13.1513. На более ранних будет работать вплоть до релиза, где есть МенеджерКриптографии, ДокументDOM, ДвоичныеДанные, ПреобразованиеККаноническомуXML и функции для работы с Base64.
P.S. Буду очень благодарен, если кто-нибудь сможет ответить на пару вопросов:
1. Так как используется COM, работать все это будет только на Windows. Если конвертацию в UTF8 можно переписать на 1С, то аналога CAdESCOM в Linux нет и не будет. Может, кто знает, как можно получить хеш и сигнатуру из КриптоПро в консоли на Linux.
2. Элемент подписи создается с помощью ДокументDOM фактически вручную, то есть поэтапным созданием каждого узла. Дописать в ДокументDOM кусок получилось из объекта ФабрикаXDTO, но началась путаница с пространствами имен и каноникализацией. Возможно, все-таки перепишу с использованием фабрики и макета. А вот вставить в один ДокументDOM кусок другого ДокументDOM, созданного из макета, у меня не получилось, хотя в СП такая возможность вроде как декларируется. Если кто подскажет, как — скажу спасибо.
P.P.S. Не на тему ЭЦП, но около. Если кто-нибудь озадачится вопросом создания туннеля по стандарту ГОСТ 2022, как этого требует ГИС ЖКХ и не только он, при наличии КриптоПро с этим отлично справляется их форк STunnel — stunnel-msspi. В него уже встроены необходимые алгоритмы, при этом нет необходимости вытаскивать ключ из КриптоПро и хранить его в открытом виде, как требуется в случае использования оригинального STunnel. Достаточно только указать открытый ключ сертификата или имя хранилища в КриптоПро.