public class CAdESSignature
extends ru.CryptoPro.CAdES.AbstractCAdESSignature
Необходимо, чтобы: 1) был установлен JCP в JRE; 2) были установлены библиотеки AdES-core.jar и CAdES.jar; 3) были импортированы корневые сертификаты цепочек сертификатов подписи клиента, OCSP службы и службы штампов в DER-кодировке в хранилище доверенных сертификатов cacerts. Например, так: keytool -importcert -file "" -alias -keystore " /lib/security/cacerts" где keytool - утилита в папке /bin, PATH_TO_CA_CERT - путь к корневому сертификату, CERT_ALIAS - алиас сертификата для установки в хранилище (например, cryptopro_ca), PATH_TO_JRE - место установки JRE; 4) были скопированы библиотеки криптопровайдера BouncyCastle: bcpkix-jdk15on-1.60.jar и bcprov-jdk15on-1.60.jar. Ссылки на данные корневые доверенные сертификаты могут быть найдены в "Составе" клиентского сертификата, а также на сайте УЦ. Например, у тестового центра сертификации КриптоПро корневой сертификат один, его можно скачать с https://www.cryptopro.ru/certsrv/ (п. "Получить сертификат Удостоверяющего Центра или действующий список отозванных сертификатов"). Если ваш клиентский сертификат выпущен другим УЦ, то вы должны импортировать его корневой сертификат. Для включения проверки цепочки сертификатов онлайн по СОС следует задать параметр: System.setProperty("com.sun.security.enableCRLDP", "true"); или System.setProperty("com.ibm.security.enableCRLDP", "true"); В случае использования при проверке подписи валидных локальных СОС данные свойства можно не задавать. В тех случаях, когда класс CAdESSignature не используется, но предполагается применять криптопровайдер BouncyCastle и работать с ГОСТ алгоритмами, необходимо выполнить инициализацию ГОСТ алгоритмов с помощью вызова: ru.CryptoPro.CAdES.tools.Utility.initJCPAlgorithms(); Этот вызов выполняется автоматически, если используется класс CAdESSignature. До версии 2.0.39442 включительно полная проверка цепочки сертификатов оператора службы внутреннего штампа не выполнялась. В текущей версии данная проверка выполняется (для T-подписи), но может быть отключена с помощью параметра AdESUtility.PROPERTY_VALIDATE_TSP
(например, -Dru.CryptoPro.AdES.validate_tsp=false). Текущая версия также отличается более жесткой политикой в отношении наличия доказательства (CRL, OCSP) для сертификата службы штампа в усовершенствованном внутреннем штампе времени, однако в целях совместимости с предыдущими версиями проверка отключена. Она может быть включена с помощью параметраAdESUtility.PROPERTY_REQUIRE_TSP_EVIDENCE
(например, -Dru.CryptoPro.AdES.require_tsp_evidence=true). Настройка провайдера по умолчанию, используемого в CAdES, выполняется с помощьюAdESConfig
. Для включения логирования при невыясненных ошибках нужно внести в файл 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-T, CAdES-X Long Type 1, CAdES-A можно выполнить с помощью библиотек cades/cadescom (http://www.cryptopro.ru/downloads#cades). Большинство файлов BouncyCastle можно найти по ссылке http://www.bouncycastle.org/latest_releases.html.
Constructor and Description |
---|
CAdESSignature()
Конструктор.
|
CAdESSignature(boolean detached)
Конструктор.
|
CAdESSignature(boolean detached,
boolean useRawDigest)
Конструктор.
|
CAdESSignature(byte[] signature,
byte[] data,
java.lang.Integer signatureType)
Конструктор.
|
CAdESSignature(byte[] signature,
byte[] data,
java.lang.Integer signatureType,
boolean useRawDigest)
Конструктор.
|
CAdESSignature(byte[] signature,
byte[] data,
java.lang.Integer signatureType,
boolean useRawDigest,
boolean userDecode)
Конструктор.
|
CAdESSignature(java.io.InputStream signatureStream,
java.io.InputStream dataStream,
java.lang.Integer signatureType)
Конструктор.
|
CAdESSignature(java.io.InputStream signatureStream,
java.io.InputStream dataStream,
java.lang.Integer signatureType,
boolean useRawDigest)
Конструктор.
|
CAdESSignature(java.io.InputStream signatureStream,
java.io.InputStream dataStream,
java.lang.Integer signatureType,
boolean useRawDigest,
boolean userDecode)
Конструктор.
|
Modifier and Type | Method and Description |
---|---|
static boolean |
reloadCACerts()
Переинициализация, обновление списка доверенных корневых сертификатов путем
повторного чтения хранилища корневых сертификатов.
|
static void |
replaceCertificatesAndCRLs(java.io.InputStream cmsStream,
org.bouncycastle.util.Store newCertStrore,
org.bouncycastle.util.Store newCrlStore,
org.bouncycastle.util.Store newAttrCertStore,
java.io.OutputStream cmsOutStream)
Замена списка сертификатов и СОС в CAdES подписи на новые.
|
static void |
replaceSigners(java.io.InputStream cmsStream,
org.bouncycastle.cms.SignerInformationStore newSignerStore,
java.io.OutputStream cmsOutStream)
Замена списка подписантов в CAdES подписи на новый, например, при
добавлении заверителей.
|
addSigner, addSigner, addSigner, addSigner, addSigner, addSigner, addSigner, addSigner, addSigner, addSigner, close, decode, getCAdESSignerInfo, getCAdESSignerInfos, getCertificateStore, getCrlStore, getSignedContent, open, setCertificateStore, setCRLStore, setCRLStore, setOptions, update, update, verify, verify, verify, verify
public CAdESSignature(byte[] signature, byte[] data, java.lang.Integer signatureType) throws CAdESException
Пример усовершенствования и проверки совмещенной подписи с использованием массивов (полный текст примера находится в samples.jar/CAdES.EnhanceExample, samples.jar/CAdES.VerifyExample). System.setProperty("com.sun.security.enableCRLDP", "true"); System.setProperty("com.ibm.security.enableCRLDP", "true"); // Исходная CAdES-BES подпись в виде массива байтов. byte[] cadesCms = ...; // Цепочка сертификатов подписи. List<X509Certificate> chain = ...; // Сертификаты для проверки подписи. Set<X509Certificate> certs = ...; // Декодируем и проверяем совмещенную CAdES-BES подпись. CAdESSignature cadesSignature = new CAdESSignature(cadesCms, null, CAdESType.CAdES_BES); // декодирование cadesSignature.verify(certs); // проверка, если необходима // Получаем отдельного подписанта CAdES-BES. CAdESSigner srcSigner = cadesSignature.getCAdESSignerInfo(0); // Усовершенствуем подпись данного подписанта до CAdES-X Long Type 1. // Подписант нового класса будет возвращен функцией. srcSigner = srcSigner.enhance(JCP.PROVIDER_NAME, JCP.GOST_DIGEST_OID, chain, "http://www.cryptopro.ru:80/tsp/", CAdESType.CAdES_X_Long_Type_1); // Получаем усовершенствованную подпись. SignerInformation enhSigner = srcSigner.getSignerInfo(); SignerInformationStore dstSignerInfoStore = new SignerInformationStore(Collections.singletonList(enhSigner)); ByteArrayInputStream srcSignedData = new ByteArrayInputStream(cadesCms); // исходная подпись в массиве ByteArrayOutputStream dstSignedData = new ByteArrayOutputStream(); // будущая усовершенствованная подпись в массиве // В исходной подписи srcSignedData заменяем подписанта. CAdESSignature.replaceSigners(srcSignedData, dstSignerInfoStore, dstSignedData); // Усовершенствованная подпись в массиве. byte[] resultCms = dstSignedData.toByteArray(); // Декодируем усовершенствованную совмещенную CAdES-X Long Type 1 подпись. cadesSignature = new CAdESSignature(resultCms, null, CAdESType.CAdES_X_Long_Type_1); // Проверяем подпись. cadesSignature.verify(null);
signature
- CAdES подпись.data
- Данные, использовавшиеся для подписи. Если подпись
совмещенная, то может быть null. Если данные не заданы, то считается,
что подпись совмещенная, иначе отделенная.signatureType
- Тип подписи. Может быть null. Если тип null, то
все подписи, в том числе и заверяющие, будут проверены с самостоятельным
вычислением типа подписи, иначе при проверке будет использован указанный
тип.CAdESException
public CAdESSignature(byte[] signature, byte[] data, java.lang.Integer signatureType, boolean useRawDigest) throws CAdESException
signature
- CAdES подпись.data
- Данные, использовавшиеся для подписи. Если подпись
совмещенная, то может быть null. Если данные не заданы, то считается,
что подпись совмещенная, иначе отделенная.signatureType
- Тип подписи. Может быть null. Если тип null, то
все подписи, в том числе и заверяющие, будут проверены с самостоятельным
вычислением типа подписи, иначе при проверке будет использован указанный
тип.useRawDigest
- True, если в качестве данных используется хеш.CAdESException
public CAdESSignature(byte[] signature, byte[] data, java.lang.Integer signatureType, boolean useRawDigest, boolean userDecode) throws CAdESException
AbstractCAdESSignature.decode()
позже.signature
- CAdES подпись.data
- Данные, использовавшиеся для подписи. Если подпись
совмещенная, то может быть null. Если данные не заданы, то считается,
что подпись совмещенная, иначе отделенная.signatureType
- Тип подписи. Может быть null. Если тип null, то
все подписи, в том числе и заверяющие, будут проверены с самостоятельным
вычислением типа подписи, иначе при проверке будет использован указанный
тип.useRawDigest
- True, если в качестве данных используется хеш.userDecode
- True, если выполнение AbstractCAdESSignature.decode()
должно быть отложено, например, с целью получения данных из
поточной подписи перед ее проверкой.CAdESException
public CAdESSignature(java.io.InputStream signatureStream, java.io.InputStream dataStream, java.lang.Integer signatureType) throws CAdESException
Пример усовершенствования и проверки совмещенной подписи с использованием потоков (полный текст примера находится в samples.jar/CAdES.EnhanceStreamExample, samples.jar/CAdES.VerifyStreamExample). System.setProperty("com.sun.security.enableCRLDP", "true"); System.setProperty("com.ibm.security.enableCRLDP", "true"); // Исходная CAdES-BES подпись в виде потока байтов из файла. FileInputStream cadesCms = new FileInputStream("signature.file"); // Цепочка сертификатов подписи. List<X509Certificate> chain = ...; // Сертификаты для проверки подписи. Set<X509Certificate> certs = ...; // Декодируем и проверяем совмещенную CAdES-BES подпись. CAdESSignature cadesSignature = new CAdESSignature(cadesCms, null, CAdESType.CAdES_BES); // декодирование cadesSignature.verify(certs); // проверка, если необходима cadesCms.close(); // Получаем отдельного подписанта CAdES-BES. CAdESSigner srcSigner = cadesSignature.getCAdESSignerInfo(0); // Усовершенствуем подпись данного подписанта до CAdES-X Long Type 1. // Подписант нового класса будет возвращен функцией. srcSigner = srcSigner.enhance(JCP.PROVIDER_NAME, JCP.GOST_DIGEST_OID, chain, "http://www.cryptopro.ru:80/tsp/", CAdESType.CAdES_X_Long_Type_1); // Получаем усовершенствованную подпись. SignerInformation enhSigner = srcSigner.getSignerInfo(); SignerInformationStore dstSignerInfoStore = new SignerInformationStore(Collections.singletonList(enhSigner)); FileInputStream srcSignedData = new FileInputStream("signature.file"); // исходная подпись в файле FileOutputStream dstSignedData = new FileOutputStream("enhanced_signature.file"); // будущая усовершенствованная подпись в файле // В исходной подписи srcSignedData заменяем подписанта на нового. CAdESSignature.replaceSigners(srcSignedData, dstSignerInfoStore, dstSignedData); srcSignedData.close(); dstSignedData.close(); // Усовершенствованная подпись сохранена в файл enhanced_signature.file. // Усовершенствованная подпись из файла. FileInputStream resultCms = new FileInputStream("enhanced_signature.file"); // Декодируем усовершенствованную совмещенную CAdES-X Long Type 1 подпись. cadesSignature = new CAdESSignature(resultCms, null, CAdESType.CAdES_X_Long_Type_1); // Проверяем подпись. cadesSignature.verify(null); resultCms.close();
signatureStream
- Поток, содержащий CAdES подпись.dataStream
- Поток из файла с данными, использовавшимися для
подписи.
Если подпись совмещенная, то может быть null. Если файл не задан,
то считается, что подпись совмещенная, иначе отделенная.signatureType
- Тип подписи. Может быть null. Если тип null,
то все подписи, в том числе и заверяющие, будут проверены с
самостоятельным вычислением типа подписи, иначе при проверке будет
использован указанный тип.CAdESException
public CAdESSignature(java.io.InputStream signatureStream, java.io.InputStream dataStream, java.lang.Integer signatureType, boolean useRawDigest) throws CAdESException
signatureStream
- Поток, содержащий CAdES подпись.dataStream
- Поток из файла с данными, использовавшимися для
подписи.
Если подпись совмещенная, то может быть null. Если файл не задан,
то считается, что подпись совмещенная, иначе отделенная.signatureType
- Тип подписи. Может быть null. Если тип null,
то все подписи, в том числе и заверяющие, будут проверены с
самостоятельным вычислением типа подписи, иначе при проверке будет
использован указанный тип.useRawDigest
- True, если в качестве данных используется хеш.CAdESException
public CAdESSignature(java.io.InputStream signatureStream, java.io.InputStream dataStream, java.lang.Integer signatureType, boolean useRawDigest, boolean userDecode) throws CAdESException
AbstractCAdESSignature.decode()
позже.
Пример проверки совмещенной подписи с использованием потоков и отключением декодирования с целью извлечения подписанных данных (контента). System.setProperty("com.sun.security.enableCRLDP", "true"); System.setProperty("com.ibm.security.enableCRLDP", "true"); // Исходная CAdES-BES подпись в виде потока байтов из файла. FileInputStream cadesCms = new FileInputStream("signature.file"); // Сертификаты для проверки подписи. Set<X509Certificate> certs = ...; // Откладываем декодирование, извлекаем подписанные // данные, декодируем и проверяем совмещенную CAdES-BES подпись. CAdESSignature cadesSignature = new CAdESSignature(cadesCms, null, CAdESType.CAdES_BES, false, true); // откладываем декодирование, передав последним параметром userDecode = true InputStream contentStream = cadesSignature.getSignedContent(); // поток подписанных данных (контент) if (contentStream != null) { // если подпись отделенная, то contentStream == null final int size = 16 * 1024 * 1024; byte[] buffer = new byte[size]; int read; FileOutputStream fileContentStream = new FileOutputStream("content.bin"); // файл для сохранения контента while ((read = contentStream.read(buffer, 0, size)) > 0) { fileContentStream.write(buffer, 0, read); } // while fileContentStream.close(); } cadesSignature.decode(); // самостоятельно вызываем декодирование подписи cadesSignature.verify(certs); // проверка, если необходима
signatureStream
- Поток, содержащий CAdES подпись.dataStream
- Поток из файла с данными, использовавшимися для
подписи.
Если подпись совмещенная, то может быть null. Если файл не задан,
то считается, что подпись совмещенная, иначе отделенная.signatureType
- Тип подписи. Может быть null. Если тип null,
то все подписи, в том числе и заверяющие, будут проверены с
самостоятельным вычислением типа подписи, иначе при проверке будет
использован указанный тип.useRawDigest
- True, если в качестве данных используется хеш.userDecode
- True, если выполнение AbstractCAdESSignature.decode()
должно быть отложено, например, с целью получения данных из
поточной подписи перед ее проверкой.CAdESException
public CAdESSignature(boolean detached) throws CAdESException
1. Пример создания совмещенной подписи с использованием массивов (полный текст примера находится в samples.jar/CAdES.SignExample). System.setProperty("com.sun.security.enableCRLDP", "true"); System.setProperty("com.ibm.security.enableCRLDP", "true"); // Закрытый ключ подписи A. PrivateKey privateKeyA = ...; // Закрытый ключ подписи B. PrivateKey privateKeyB = ...; // Цепочка сертификатов подписи A. List<X509Certificate> chainA = ...; // Цепочка сертификатов подписи B. List<X509Certificate> chainB = ...; // Создаем CAdES подпись. CAdESSignature cadesSignature = new CAdESSignature(false); // Добавляем CAdES-BES подпись №1. cadesSignature.addSigner(JCP.PROVIDER_NAME, JCP.GOST_DIGEST_OID, JCP.GOST_EL_KEY_OID, privateKeyA, chainA, CAdESType.CAdES_BES, null, false); // Добавляем CAdES-X Long Type 1 подпись №2. cadesSignature.addSigner(JCP.PROVIDER_NAME, JCP.GOST_DIGEST_OID, JCP.GOST_EL_KEY_OID, privateKeyB, chainB, CAdESType.CAdES_X_Long_Type_1, "http://www.cryptopro.ru:80/tsp/", false); // Данные для подписи в виде массиве. byte[] data = ...; // Будущая подпись в виде массива. ByteArrayOutputStream signatureStream = new ByteArrayOutputStream(); cadesSignature.open(signatureStream); // подготовка контекста cadesSignature.update(data); // хеширование cadesSignature.close(); // создание подписи с выводом в signatureStream signatureStream.close(); // Получаем подпись с двумя подписантами в виде массиве. byte[] cadesCms = signatureStream.toByteArray(); 2. Пример создания совмещенной подписи с использованием потоков (полный текст примера находится в samples.jar/CAdES.SignStreamExample). System.setProperty("com.sun.security.enableCRLDP", "true"); System.setProperty("com.ibm.security.enableCRLDP", "true"); // Закрытый ключ подписи A. PrivateKey privateKeyA = ...; // Закрытый ключ подписи B. PrivateKey privateKeyB = ...; // Цепочка сертификатов подписи A. List<X509Certificate> chainA = ...; // Цепочка сертификатов подписи B. List<X509Certificate> chainB = ...; // Создаем CAdES подпись. CAdESSignature cadesSignature = new CAdESSignature(false); // Добавляем CAdES-BES подпись. cadesSignature.addSigner(JCP.PROVIDER_NAME, JCP.GOST_DIGEST_OID, JCP.GOST_EL_KEY_OID, privateKeyA, chainA, CAdESType.CAdES_BES, null, false); // Добавляем CAdES-X Long Type 1 подпись. cadesSignature.addSigner(JCP.PROVIDER_NAME, JCP.GOST_DIGEST_OID, JCP.GOST_EL_KEY_OID, privateKeyB, chainB, CAdESType.CAdES_X_Long_Type_1, "http://www.cryptopro.ru:80/tsp/", false); // Данные для подписи в виде потока из файла. FileInputStream data = new FileInputStream("data.file"); // Будущая подпись в виде потока в файл. FileOutputStream signatureStream = new FileOutputStream("signature.file"); cadesSignature.open(signatureStream); // подготовка контекста int buffer_size = 1024 * 1024; byte[] buffer = new byte[buffer_size]; int read; // Чтение файла и хеширование данных while ( (read = data.read(buffer, 0, buffer_size)) > 0 ) { cadesSignature.update(buffer, 0, read); } cadesSignature.close(); // создание подписи с выводом в signatureStream data.close(); signatureStream.close(); // Подпись с двумя подписантами сохранена в файл signature.file.
detached
- True, если подпись отделенная.CAdESException
public CAdESSignature(boolean detached, boolean useRawDigest) throws CAdESException
detached
- True, если подпись отделенная.useRawDigest
- True, если в качестве данных используется
хеш.CAdESException
public CAdESSignature() throws CAdESException
1. Пример заверения совмещенной подписи с использованием массивов (полный текст примера находится в samples.jar/CAdES.CountersignatureExample). System.setProperty("com.sun.security.enableCRLDP", "true"); System.setProperty("com.ibm.security.enableCRLDP", "true"); // Исходная CAdES-BES подпись в виде массива. byte[] cadesCms = ...; // Цепочка сертификатов подписи. List<X509Certificate> chain = ...; // Сертификаты для проверки подписи. Set<X509Certificate> certs = ...; // Декодируем и проверяем совмещенную CAdES-BES подпись. CAdESSignature cadesSignature = new CAdESSignature(cadesCms, null, CAdESType.CAdES_BES); // декодирование cadesSignature.verify(certs); // проверка, если необходима // Получаем заверяемую подпись. CAdESSigner srcSigner = cadesSignature.getCAdESSignerInfo(0); // Закрытый ключ заверителя. PrivateKey privateKeyC = ...; // Цепочка сертификатов заверителя. ListchainC = ...; // Создаем заверяющую совмещенную подпись. CAdESSignature counterSignature = new CAdESSignature(); // Добавляем CAdES-X Long Type 1 подпись. counterSignature.addSigner(JCP.PROVIDER_NAME, JCP.GOST_DIGEST_NAME, JCP.GOST_EL_KEY_OID, privateKeyC, chainC, CAdESType.CAdES_X_Long_Type_1, "http://www.cryptopro.ru:80/tsp/", true); // Подписываем данные заверяемой подписи (т.е. байтовое представление // поля signature заверяемой подписи). // Будущая подпись в виде массива. ByteArrayOutputStream signatureStream = new ByteArrayOutputStream(); cadesSignature.open(signatureStream); // подготовка контекста cadesSignature.update(srcSigner.getSignerInfo().getSignature()); // хеширование cadesSignature.close(); // создание подписи с выводом в signatureStream (не используется) signatureStream.close(); // Получаем заверителя. CAdESSigner counterSigner = counterSignature.getCAdESSignerInfo(0); // Добавляем одного заверителя к подписанту. srcSigner.addCounterSigner(counterSigner.getSignerInfo()); // Получаем измененную заверяемую подпись с заверителем. SignerInformation newSigner = srcSigner.getSignerInfo(); ByteArrayInputStream srcCMSSignedData = new ByteArrayInputStream(cadesCms); // исходная подпись в виде массива ByteArrayOutputStream dstCMSSignedData = new ByteArrayOutputStream(); // будущая заверенная подпись с заверителем в виде массива // Обновляем исходную подпись новым подписантом с заверителем. CAdESSignature.replaceSigners(srcCMSSignedData, new SignerInformationStore(Collections.singletonList(newSigner)), dstCMSSignedData); // Новая подпись с заверителем в виде массива. byte[] resultCms = dstCMSSignedData.toByteArray(); 2. Пример заверения совмещенной подписи с использованием потоков (полный текст примера находится в samples.jar/CAdES.CountersignatureStreamExample). System.setProperty("com.sun.security.enableCRLDP", "true"); System.setProperty("com.ibm.security.enableCRLDP", "true"); // Исходная CAdES-BES подпись в виде потока из файла. InputStream cadesCms = new FileInputStream("signature.file"); // Цепочка сертификатов подписи. List<X509Certificate> chain = ...; // Сертификаты для проверки подписи. Set<X509Certificate> certs = ...; // Декодируем и проверяем совмещенную CAdES-BES подпись. CAdESSignature cadesSignature = new CAdESSignature(cadesCms, null, CAdESType.CAdES_BES); // декодирование cadesSignature.verify(certs); // проверка, если необходима // Получаем заверяемую подпись. CAdESSigner srcSigner = cadesSignature.getCAdESSignerInfo(0); // Закрытый ключ заверителя. PrivateKey privateKeyC = ...; // Цепочка сертификатов заверителя. List<X509Certificate> chainC = ...; // Создаем заверяющую совмещенную подпись. CAdESSignature counterSignature = new CAdESSignature(); // Добавляем CAdES-X Long Type 1 подпись. counterSignature.addSigner(JCP.PROVIDER_NAME, JCP.GOST_DIGEST_NAME, JCP.GOST_EL_KEY_OID, privateKeyC, chainC, CAdESType.CAdES_X_Long_Type_1, "http://www.cryptopro.ru:80/tsp/", true); // Подписываем данные заверяемой подписи (т.е. байтовое представление // поля signature заверяемой подписи). // Будущая подпись заверителя в виде потока в файл (не используется). // Т.к. хешируемыми данными является небольшой блок подписи getSignature() // (см. ниже), то предпочтительнее выглядит в этом участке кода работа // с массивом из примера №1 (см. выше). FileOutputStream signatureStream = new FileOutputStream("tmp.signature.file"); cadesSignature.open(signatureStream); // подготовка контекста cadesSignature.update(srcSigner.getSignerInfo().getSignature()); // хеширование cadesSignature.close(); signatureStream.close(); // Получаем заверителя. CAdESSigner counterSigner = counterSignature.getCAdESSignerInfo(0); // Добавляем одного заверителя к подписанту. srcSigner.addCounterSigner(counterSigner.getSignerInfo()); // Получаем измененную заверяемую подпись с заверителем. SignerInformation newSigner = srcSigner.getSignerInfo(); FileInputStream srcCMSSignedData = new FileInputStream("signature.file"); // исходная подпись в виде потока в файл FileOutputStream dstCMSSignedData = new FileOutputStream("counter_signature.file"); // будущая заверенная подпись с заверителем в виде потока в файл // Обновляем исходную подпись новым подписантом с заверителем. CAdESSignature.replaceSigners(srcCMSSignedData, new SignerInformationStore(Collections.singletonList(newSigner)), dstCMSSignedData); srcCMSSignedData.close(); dstCMSSignedData.close(); // Новая подпись с заверителем сохранена в файле counter_signature.file.
CAdESException
public static void replaceSigners(java.io.InputStream cmsStream, org.bouncycastle.cms.SignerInformationStore newSignerStore, java.io.OutputStream cmsOutStream) throws CAdESException
CAdESSignature(byte[], byte[], Integer)
и CAdESSignature(java.io.InputStream, java.io.InputStream, Integer)
.cmsStream
- Поток исходной CAdES подписи, в которой следует обновить
список подписантов.newSignerStore
- Новый список подписантов, который нужно поместить в
подпись.cmsOutStream
- Полученная CAdES подпись с подмененным списком подписантов.CAdESException
public static void replaceCertificatesAndCRLs(java.io.InputStream cmsStream, org.bouncycastle.util.Store newCertStrore, org.bouncycastle.util.Store newCrlStore, org.bouncycastle.util.Store newAttrCertStore, java.io.OutputStream cmsOutStream) throws CAdESException
cmsStream
- Поток исходной CAdES подписи, в которой следует обновить
список сертификатов и СОС.newCertStrore
- Новый список сертификатов, который следует поместить
в подпись. null если отсутствует.newCrlStore
- Новый СОС, который следует поместить в подпись.
null если отсутствует.newAttrCertStore
- Новый список сертификатов аттрибутов, который
следует поместить в подпись. null если отсутствует.cmsOutStream
- Полученная CAdES подпись с подмененным списком сертификатов и СОС.CAdESException
public static boolean reloadCACerts()