Статус: Активный участник
Группы: Участники
Зарегистрирован: 26.09.2012(UTC) Сообщений: 57 Откуда: Москва
Сказал(а) «Спасибо»: 5 раз Поблагодарили: 1 раз в 1 постах
|
Добрый день!
(к сожалению, подсветку синтаксиса не получилось сделать. когда я вставлял code=java с квадратными скобками - часть текста пропадала :(
Пытаюсь реализовать работу с ЭЦП с помощью CAdES. Возникли такие вопросы:
1) В примере SignExample создается присоединенная подпись:
CAdESSignature cadesSignature = new CAdESSignature(false); cadesSignature.addSigner(privateKey, chain, CAdESType.CAdES_X_Long_Type_1, Configuration.TSA_ADDRESS); byte[] cadesCms = cadesSignature.sign(data);
А как мне создать отсоединенную?
И как мне её потом проверить? Подозреваю, что в конструкторе CAdESSignature нужно будет 2-ым параметром передавать данные, которые подписывались. Я прав?
CAdESSignature cadesSignature = new CAdESSignature(signature, data, null);
2) Есть ли возможность подписывать/проверять не массив байт, а поток данных (InputStream)?
3) Есть подозрения, что в примере VerifyExample строка Configuration.loadConfiguration(chain) лишняя:
Collection<X509Certificate> chain = new ArrayList<X509Certificate>(); //Configuration.loadConfiguration(chain);
byte[] cadesCms = Array.readFile(Configuration.TEST_DIR + Configuration.SIGNATURE_FILENAME);
CAdESSignature cadesSignature = new CAdESSignature(cadesCms, null, null); cadesSignature.verify(chain);
я прав? иначе не понятно, зачем при проверке указывать хранилище, ключ и пароль...
4) Мне нужно к существующему подписанному файлу добавить ещё одного подписанта, правильно ли я делаю?
Collection<X509Certificate> chain = new ArrayList<X509Certificate>(); Configuration.loadConfiguration(chain); CAdESSignature cadesSignature = new CAdESSignature(data, null, null); cadesSignature.addSigner(privateKey, chain, CAdESType.CAdES_X_Long_Type_1, CMStools.TSA_ADDRESS); byte[] cadesCms = cadesSignature.sign(data);
здесь data - это данные уже ранее совмещенные с 1-ой подписью.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,001 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 712 раз в 673 постах
|
Здравствуйте. 1) В конструкторе CAdESSignature первый параметр false - это и есть detached (см. javadoc-документацию). 2) Возможности подписать/проверить поток пока нет. 3) Configuration обобщает операции с ключом и сертификатами. например, в примере подписи loadConfiguration не только получает цепочку из контейнера, но и возвращает закрытый ключ. При проверке это не нужно, может понадобиться только цепочка. Предполагается, что для выполнения примера есть контейнер с ключом и сертификатом. 4) Примерно так: Код:
// 1. Декодирование и проверка исходной подписи с одним-двумя
// подписантами.
// Читаем существующую подпись из файла.
byte[] existSign = Array.readFile(Configuration.TEST_DIR +
Configuration.SIGNATURE_FILENAME);
CAdESSignature existCadesSignature = new CAdESSignature(existSign, null, null);
// Список CRL.
List<X509CRL> crlList = null;
// Если задан CRL, то читаем его из файла.
if (Configuration.CRL_FILENAME != null) {
X509CRL crl = (X509CRL) CertificateFactory.getInstance("X.509")
.generateCRL(new FileInputStream(Configuration.CRL_FILENAME));
crlList = Collections.singletonList(crl);
existCadesSignature.verify(chain, crlList);
} else {
existCadesSignature.verify(chain);
}
// 2. Получение списка подписантов (1-2 шт.) из исходной
// подписи.
// Список всех подписантов в исходной подписи.
Collection<SignerInformation> existSignerInfos = new ArrayList<SignerInformation>();
for (CAdESSigner signer : existCadesSignature.getCAdESSignerInfos()) {
existSignerInfos.add(signer.getSignerInfo());
}
// 3. Создаем новую подпись с одним подписантом, которого потом
// добавим к исходным подписантам. Данные для подписи - те же, на
// которых создавались исходные подписанты.
CAdESSignature otherSignerCadesSignature = new CAdESSignature(false);
// Создаем нового подписанта CAdES-BES.
otherSignerCadesSignature.addSigner(privateKey, chain, CAdESType.CAdES_BES, null);
// Подписываем те же данные, что и подписанты из существующей подписи.
otherSignerCadesSignature.sign(Configuration.DATA);
// 4. Обновляем список из 1-2 исходных подписантов на новый с новым
// подписантом.
CAdESSigner otherSigner = otherSignerCadesSignature.getCAdESSignerInfo(0);
// Добавляем нового подписанта в список подписантов.
existSignerInfos.add(otherSigner.getSignerInfo());
CMSSignedData existCMSSignedData = existCadesSignature.getSignedData();
// Обновляем исходную подпись c ее начальным списком из 1-2 подписантов
// на тот же, но + новый подписант. Т.е. стало подписантов на одного больше.
CMSSignedData newCMSSignedData = CMSSignedData.replaceSigners(existCMSSignedData,
new SignerInformationStore(existSignerInfos));
Array.writeFile(Configuration.TEST_DIR + Configuration.SIGNATURE_FILENAME +
".plus_new_signer.bin", newCMSSignedData.getEncoded());
// 5. Проверим новую подпись из 2-3 подписантов.
// Подпись в тесте была совмещенная, потому данные равны null. Предположим, что
// подписей несколько, тогда лучше указать тип null и положиться на самоопределение
// типа подписи.
CAdESSignature cadesSignature =
new CAdESSignature(newCMSSignedData.getEncoded(), null, null);
if (crlList != null) {
cadesSignature.verify(chain, crlList);
} else {
cadesSignature.verify(chain);
}
Configuration.printSignatureInfo(cadesSignature);
Отредактировано пользователем 22 января 2013 г. 12:35:15(UTC)
| Причина: Не указана |
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 26.09.2012(UTC) Сообщений: 57 Откуда: Москва
Сказал(а) «Спасибо»: 5 раз Поблагодарили: 1 раз в 1 постах
|
теперь я пытаюсь подписать и проверить подпись с помощью типа CAdES_BES (использую SignExample и VerifyExample) Collection<X509Certificate> chain = new ArrayList<X509Certificate>(); PrivateKey privateKey = Configuration.loadConfiguration(chain); CAdESSignature cadesSignature = new CAdESSignature(true); cadesSignature.addSigner(privateKey, chain, CAdESType.CAdES_BES, null); byte[] cadesCms = cadesSignature.sign(Configuration.DATA); Array.writeFile(Configuration.TEST_DIR + Configuration.SIGNATURE_FILENAME, cadesCms);выполняется успешно Collection<X509Certificate> chain = new ArrayList<X509Certificate>(); Array.writeFile(Configuration.TEST_DIR + Configuration.SIGNATURE_FILENAME, cadesCms); CAdESSignature cadesSignature = new CAdESSignature(cadesCms, Configuration.DATA, null); cadesSignature.verify(chain);на последней строке вылетает ошибка: Код:SEVERE: Certificate Sn 7b7577aa0002000368fd issued by GeneralNames:
4: E=info@cryptopro.ru,C=RU,O=CRYPTO-PRO,CN=Test Center CRYPTO-PRO
is not found.
из-за чего такое может быть?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 26.09.2012(UTC) Сообщений: 57 Откуда: Москва
Сказал(а) «Спасибо»: 5 раз Поблагодарили: 1 раз в 1 постах
|
и ещё, после того, как я установил корневой сертификат у меня перестал работать аплет в браузере пишет: publisher cannot be verified by a trusted source
аплет я подписываю сгенеренным сертификатом:
keytool -genkey -alias "mycert" -validity 99999 -keystore "c:\Program Files (x86)/java/jre6/lib/security/cacerts"
в этот же keystore я импортировал корневой тестовый сертификат КриптоПро:
keytool -importcert -file certnew.cer -alias cryptopro_ca1 -keystore "c:\Program Files (x86)/java/jre6/lib/security/cacerts"
если корневой сертификат удалить - аплет работает.
как мне сделать, чтобы аплет работал и с импортированным корневым сертификатом?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,001 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 712 раз в 673 постах
|
Автор: Алексей 111 на последней строке вылетает ошибка: Код:SEVERE: Certificate Sn 7b7577aa0002000368fd issued by GeneralNames:
4: E=info@cryptopro.ru,C=RU,O=CRYPTO-PRO,CN=Test Center CRYPTO-PRO
is not found.
из-за чего такое может быть? переменная chain в функции verify(chain) пустая или содержит цепочку? Отредактировано пользователем 23 января 2013 г. 17:07:03(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,001 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 712 раз в 673 постах
|
Автор: Алексей 111 я установил корневой сертификат Что это за корневой сертификат? |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 26.09.2012(UTC) Сообщений: 57 Откуда: Москва
Сказал(а) «Спасибо»: 5 раз Поблагодарили: 1 раз в 1 постах
|
Автор: afev Автор: Алексей 111 я установил корневой сертификат Что это за корневой сертификат? корневой сертификат я взял от сюда: https://www.cryptopro.ru/certsrv/выбрав "Получить сертификат Удостоверяющего Центра" > "Загрузка сертификата ЦС"
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 26.09.2012(UTC) Сообщений: 57 Откуда: Москва
Сказал(а) «Спасибо»: 5 раз Поблагодарили: 1 раз в 1 постах
|
Автор: afev Автор: Алексей 111 на последней строке вылетает ошибка: Код:SEVERE: Certificate Sn 7b7577aa0002000368fd issued by GeneralNames:
4: E=info@cryptopro.ru,C=RU,O=CRYPTO-PRO,CN=Test Center CRYPTO-PRO
is not found.
из-за чего такое может быть? переменная chain в функции verify(chain) пустая или содержит цепочку? переменная chain - пустая. если при подписывании использовать тип CAdES_X_Long_Type_1: Код:cadesSignature.addSigner(privateKey, chain, CAdESType.CAdES_X_Long_Type_1, Configuration.TSA_ADDRESS);
то проверка работает
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,001 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 712 раз в 673 постах
|
Потому что для проверки CAdES-BES нужен клиентский сертификат. В CAdES-X Long Type 1 этот сертификат есть в подписи. |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,001 Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 712 раз в 673 постах
|
Автор: Алексей 111 publisher cannot be verified by a trusted source Попробуйте включить логирование. |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close