Использование интерфейса языка С

Использование интерфейса языка С ЭЦП

Использование интерфейса языка с

Интерфейс языка С описан в настоящем руководстве. Для его использования в инструментарий разработчика включены следующие файлы:

НазначениеИмя файла
Заголовочный файл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)

  1. Установите на ваш компьютер КриптоПро ЭЦП SDK (cadessdk.msi).

  2. Если вы планируете запускать 64-разрядное приложение, то установите на ваш компьютер 64-разрядный КриптоПро ЭЦП Runtime (cades-x64.msi).

  3. Убедитесь, что переменная окружения INCLUDE (путь к заголовочным файлам) содержит путь к заголовочным файлам КриптоПро ЭЦП SDK.
    В Microsoft Visual Studio это можно настроить следующим образом: в окне настроек Tools->Options в левом столбце выберите пункт Projects and Solutions->VC Directories. Справа из ниспадающего меню выбора типа файлов Show directories for выберите пункт Include files.
    Заголовочный файл cades.h устанавливается в каталог %ProgramFiles%Crypto ProSDKinclude.

  4. Убедитесь, что переменная окружения 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.

  1. Установите дистрибутив c совместимой версией КриптоПро CSP.

  2. Установите пакет 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 документа в конце был добавлен новый узел с подписью. Подписанное сообщение выглядит следующим образом:

Оцените статью
ЭЦП64
Добавить комментарий