ФОРМИРОВАНИЕ, ПРОВЕРКА И УЛУЧШЕНИЕ ПОДПИСИ ФОРМАТА CAdES-BES И CAdES-X LONG TYPE 1 С ПОМОЩЬЮ БИБЛИОТЕКИ JCP CAdES API 1.0.1

Необходимо, чтобы:
1) был установлен JCP в JRE;
2) был импортирован корневой сертификат цепочки сертификатов в DER-кодировке в хранилище доверенных сертификатов JRE cacerts. Например, так:
	keytool -importcert -file "<PATH_TO_CA_CERT>" -alias <CERT_ALIAS> -keystore "<PATH_TO_JRE>/lib/security/cacerts"
	где keytool - утилита в папке <JRE>/bin, 
	PATH_TO_CA_CERT - путь к корневому сертификату, 
	CERT_ALIAS - алиас сертификата для установки в хранилище (например, cryptopro_ca),
	PATH_TO_JRE - место установки JRE;
3) был установлен криптопровайдер BouncyCastle (см. ссылки внизу).

###### JCP CAdES API ######

Интерфейсы для формирования, проверки и улучшения подписи CAdES представлены двумя классами пакета CAdES, примеры и описание которых есть в документации:
1) CAdESSignature - класс подписи CAdES;
2) CAdESSigner - класс подписавшего.

CAdESSignature предназначен для формирования подписи (addSigner, sign), проверки (verify) и улучшения (enhance). Поддерживаются 2 типа подписей: CAdES-BES и CAdES-X Long Type 1.
Тип CAdES-BES содержит подписанные аттрибуты: ссылку на сертификат ключа подписи signing-certificateV2, тип данных, хеш данных и др. (например, дату подписи).
Тип CAdES-X Long Type 1 содержит подписанные аттрибуты и неподписанные аттрибуты: ссылки на сертификаты цепочек СКП и сертификаты доказательств complete-certificate-references, ссылки на доказательства валидности сертификатов complete-revocation-references, сертификаты certificate-values и доказательства revocation-values, внутренний штамп времени signature-time-stamp (с собственными ссылками, сертификатами и доказательствами) и внешний штамп времени cades-c-time-stamp.
CAdESSigner предназначен для операций с отдельным подписавшим, например, при улучшении (enhance) или создании заверяющей подписи countersignature (addCounterSigner).
Классы содержат несколько служебных функций, которые позволяют получить дополнительную информацию о подписи (getSignerInfo). В некоторых случаях необходимо, чтобы подпись была предварительно декодирована или сформирована (getSigningTImestampToken, getCAdESCTImestampToken).

В тех случаях, когда класс CAdESSignature не используется, но предполагается применять криптопровайдер BouncyCastle и работать с ГОСТ алгоритмами, необходимо выполнить инициализацию ГОСТ алгоритмов с помощью вызова:
ru.CryptoPro.CAdES.tools.Utility.initJCPAlgorithms();
Этот вызов выполняется автоматически, если используется класс CAdESSignature.

###### Обработка исключений ######

Конструкторы и методы классов генерируют различные исключения, которые могут быть условно поделены на две группы:
1) стандартные, типа "неправильный формат сертификата", "не найден файл", "неправильный формат OCSP структуры" и др.
2) касающиеся структуры подписи CAdES, типа "неправильное количество аттрибутов", "отсутствует ссылка на сертификат" и др.

Для первой группы генерируются и передаются стандартные сообщения, предусмотренные стандартом BouncyCastle, - они "заворачиваются" в CAdESException; вторая группа сразу генерирует исключения CAdESException с описанием и кодом, которые пользователь может разобрать и установить причину ошибки. Класс CAdESException размещен в пакете ru.CryptoPro.CAdES.exception.
С помощью setProperty("ru.CryptoPro.notThrowIfChainIsInvalid", "true") можно отключить генерацию исключения при проверке цепочки сертификатов (например, когда
статус сертификата проверять ненужно и невозможно).

###### Запуск примеров в папке CAdES (samples-sources.jar) ######

В файле Configuration необходимо указать правильные:
1) KEY_ALIAS - алиас ключа для подписи;
2) KEY_PASSWORD - пароль для доступа к ключу;
3) TEST_DIR - место сохранения файлов;
4) CRL_FILENAME - путь к файлу CRL для проверки подписи CAdES-BES оффлайн (можно задать null);
5) TSA_ADDRESS - адрес TSA службы (для подписи CAdES-X Long Type 1).

В подпапке speed находится ComplexSpeedTest - тест производительности создания, проверки и усовершенствования подписи. 
В нем можно указать вид операции, количество потоков и количество операций в потоке.

Перед запуском примеров следует установить все корневые сертификаты (выдавшего сертификат Удостоверяющего Центра, службы штампов TSA, OCSP-службы) в хранилище cacerts.
Ссылки на данные корневые доверенные сертификаты могут быть найдены в "Составе" клиентского сертификата, а также на сайте УЦ. Например, у тестового центра сертификации КриптоПро корневой сертификат один, его можно скачать с https://www.cryptopro.ru/certsrv/ (п. "Получить сертификат Удостоверяющего Центра или действующий список отозванных сертификатов"). Если ваш клиентский сертификат выпущен другим УЦ, то вы должны импортировать его корневой сертификат.

Для включения проверки цепочки сертификатов онлайн по СОС следует задать параметр:

System.setProperty("com.sun.security.enableCRLDP", "true");
или
System.setProperty("com.ibm.security.enableCRLDP", "true");

В случае использования при проверке подписи валидных локальных СОС данные свойства можно не задавать.

###### Логирование ######

Для включения логирования при невыясненных ошибках нужно внести в файл logging.properties JRE следующее:
...
handlers=java.util.logging.ConsoleHandler
...
.level= INFO
...
java.util.logging.ConsoleHandler.level = FINER
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
...
ru.CryptoPro.JCP.tools.JCPLogger.level = FINE
ru.CryptoPro.JCP.tools.JCPLogger.handlers = java.util.logging.FileHandler

###### Дополнительно ######

В пакете tools имеется несколько классов с вспомогательными функциями.

Проверку подписей типов CAdES-BES и CAdES-X Long Type 1 можно выполнить с помощью библиотек cades/cadescom (http://www.cryptopro.ru/downloads#cades).

Для использования JCP CAdES API 1.0 требуются библиотеки:
1) jar-файлы криптопровайдера BouncyCastle И CAdES API:
	bcmail-jdk16-146.jar
	bctsp-jdk16-146.jar
	bcprov-jdk16-146.jar
	commons-codec-1.3.jar
2) jar-библиотеки для JCP:
	xalan.jar и xmlsec.jar для JCPxml.jar
	serializer.jar
	commons-logging.jar

Большинство файлов BouncyCastle можно найти по ссылке http://www.bouncycastle.org/latest_releases.html.

