Использование интерфейса языка с
Интерфейс языка С описан в настоящем руководстве. Для его использования в инструментарий разработчика включены следующие файлы:
Назначение | Имя файла |
---|---|
Заголовочный файл | ades-core.h |
Заголовочный файл | cades.h |
Заголовочный файл | xades.h |
Библиотека импорта | cades.lib — для платформ Win32 и x64 (только для Windows) |
Библиотека импорта | xades.lib — для платформ Win32 и x64 (только для Windows) |
Динамическая библиотека | cades.dll — для платформ Win32 и x64 (Windows) libxades.so — для платформ ia32 и x64 (Unix) |
Динамическая библиотека | xades.dll — для платформ Win32 и x64 (Windows) libxades.so — для платформ ia32 и x64 (Unix) |
Модуль слияния | cades_win32.msm, cades_x64.msm (только для Windows) |
Пакет для установки | cades-win32.msi, cades-x64.msi (Windows) *cades*.rpm (Unix) |
Установите на ваш компьютер КриптоПро ЭЦП SDK (cadessdk.msi).
Если вы планируете запускать 64-разрядное приложение, то установите на ваш компьютер 64-разрядный КриптоПро ЭЦП Runtime (cades-x64.msi).
Убедитесь, что переменная окружения INCLUDE (путь к заголовочным файлам) содержит путь к заголовочным файлам КриптоПро ЭЦП SDK.
В Microsoft Visual Studio это можно настроить следующим образом: в окне настроек Tools->Options в левом столбце выберите пункт Projects and Solutions->VC Directories. Справа из ниспадающего меню выбора типа файлов Show directories for выберите пункт Include files.
Заголовочный файл cades.h устанавливается в каталог %ProgramFiles%Crypto ProSDKinclude.Убедитесь, что переменная окружения LIB (путь к файлам библиотек) содержит путь к файлам библиотек КриптоПро ЭЦП SDK.
В Microsoft Visual Studio это можно настроить следующим образом: в окне настроек Tools->Options в левом столбце выберите пункт Projects and Solutions->VC Directories. Справа из ниспадающего меню выбора типа файлов Show directories for выберите пункт Library files.
Для платформы Win32 cades.lib устанавливается в каталог %ProgramFiles%Crypto ProSDKlib.
Для платформы x64 cades.lib устанавливается в каталог %ProgramFiles%Crypto ProSDKlibamd64.
Установите дистрибутив c совместимой версией КриптоПро CSP.
Установите пакет cprocsp-pki-cades*.
Для использования интерфейса языка С необходимо:
Для использования интерфейса языка С необходимо:
Для работы с CAdES компоновать приложение с библиотекой libcades.so.
Для работы с XAdES компоновать приложение с библиотекой libxades.so.
Для установки библиотеки cades.dll/xades.dll на компьютере пользователя рекомендуется использовать модули слияния. Если Ваше приложение не имеет собственного установочного пакета, то можно воспользоваться пакетами Windows Installer cades-win32.msi или cades-x64.msi в зависимости от платформы Вашего приложения.
В зависимости от операционной системы, на которую устанавливается библиотека cades.dll/xades.dll инструментария, возможно различное поведение установщика:
Такой подход к установке позволяет изолировать ваше приложение, использующее функции КриптоПро ЭЦП SDK. Если другое приложение, содержащее в своём составе библиотеки КриптоПро ЭЦП SDK других версий, будет установлено на один компьютер с Вашим приложением, то оба приложения будут использовать те версии библиотек, с которыми они разрабатывались и тестировались, а влиять друг на друга они не будут.
Установите совместимую версию КриптоПро CSP и пакет cprocsp-pki-cades*, подходящий для Вашей ОС.
Подпишем
Далее готовим ключ подписи и сертификат для добавления в подпись. На случай проверки ЭЦП выполняется загрузка списка доверенных корневых сертификатов из специального, заранее подготовленного хранилища. Кроме того, может быть задействован дополнительный список сертификатов (например, промежуточных) и CRL (на случай оффлайновой проверки цепочки сертификатов).
final KeyStore keyStore = KeyStore.getInstance("HDImageStore", JCP.PROVIDER_NAME); keyStore.load(null, null); final PrivateKey privateKey = (PrivateKey) keyStore.getKey(<key_alias>, <key_password>); final X509Certificate cert = (X509Certificate) keyStore.getCertificate(<key_alias>); // Загрузка списка доверенных корневых сертификатов (для последующей за созданием подписи проверкой цепочки сертификатов final KeyStore trustStore = GostXAdESUtility.loadCertStore(trustStorePath, trustStorePassword); // Список дополнительных сертификатов (например, промежуточных) и CRL final CertStore intermediateCertsAndCRLStore = CertStore.getInstance("Collection", new CollectionCertStoreParameters(intermediateCertsAndCRLs)); final KeyingDataProvider keyingProvider = new DirectKeyingDataProvider(cert, privateKey);
Проверим
Для полноты картины хорошо бы ещё уметь проверять такие подписи. Для начала найдём узел подписи и создадим профиль проверки:
// Проверяемый документ final Document verifyDocument = sourceDocument; // Узел с подписью (предположительно, один). final NodeList nl = verifyDocument.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature"); if (nl.getLength() == 0) { throw new Exception("Cannot find Signature element"); } // if // Проверка цепочки сертификатов включена final CertificateValidationProvider validationProvider = new PKIXCertificateValidationProvider( trustStore, true, intermediateCertsAndCRLStore); final XadesVerificationProfile verProf = new XadesVerificationProfile(validationProvider) .withTimeStampTokenVerifier(new GostTimeStampVerificationProvider( validationProvider, …)) .withDigestEngineProvider(new DefaultMessageDigestProvider() { @Override public MessageDigest getEngine(String digestAlgorithmURI) throws UnsupportedAlgorithmException { // Определение OID’а алгоритма хэширования по URN final String digestAlgOid = GostXAdESUtility.digestUri2Digest(digestAlgorithmURI); try { return MessageDigest.getInstance(digestAlgOid); } catch (NoSuchAlgorithmException e) { throw new UnsupportedAlgorithmException(e.getMessage(), digestAlgorithmURI, e); } } });
Теперь можно проверить подпись и сертификаты:
final XadesVerifier verifier = verProf.newVerifier(); final Element signatureElement = (Element) nl.item(0); // предположительно, один узел с подписью verifier.verify(signatureElement, null);
В итоге
Таким образом, в узел finalPayment документа в конце был добавлен новый узел с подписью. Подписанное сообщение выглядит следующим образом: