Статус: Активный участник
Группы: Участники
Зарегистрирован: 27.02.2013(UTC) Сообщений: 38  Откуда: Москва Сказал(а) «Спасибо»: 14 раз Поблагодарили: 11 раз в 9 постах
|
В CSP цепочка сертификатов строится В JCP не строится Через браузерный плагин сообщение подписывается Через JCP - нет Ради эксперимента пыталась 1. Скопировать всю цепочку в HDImageStore (пробовала аналогично и в MemoryStore) Код:
System.setProperty("com.sun.security.enableCRLDP", "true");
System.setProperty("com.ibm.security.enableCRLDP", "true");
System.setProperty("ru.CryptoPro.notThrowIfChainIsInvalid", "true");
try {
KeyStore keyStore = KeyStore.getInstance(keyStoreType, keyStoreProvider);
keyStore.load(null, keyStorePassword.toCharArray());
//читаем сертификат с носителя
Enumeration<String> enumeration = keyStore.aliases();
String alias = null;
if (enumeration.hasMoreElements()) // One certificate per USB key
alias = (String) enumeration.nextElement();
if (alias==null)
throw new Exception ("No certificate found in container");
X509Certificate keyCert = (X509Certificate) keyStore.getCertificate(alias);
//читаем корневой и промежуточные сертификаты
String folderPath = keysCertificateFolder;
List<X509Certificate> certificates = getCertificatesFromFolder(folderPath);
X509Certificate[] keyCertChain = new X509Certificate[certificates.size() + 1];
keyCertChain[0] = keyCert;
for (int j = 1; j < certificates.size() + 1; j++) {
keyCertChain[j] = certificates.get(j - 1);
}
//HDImageStore
String pathToKeyStore = "xxx\\3dbe6165.000";
KeyStore jks = KeyStore.getInstance("HDImageStore");
jks.load(null, keyStorePassword.toCharArray());
//копируем в хранилище HDImageStore сертификат с цепочкой
jks.setKeyEntry(alias, keyStore.getKey(alias, keyStorePassword.toCharArray()),
keyStorePassword.toCharArray(), keyCertChain);
PrivateKey privateKey = (PrivateKey) jks.getKey(alias, keyStorePassword.toCharArray());
List<X509Certificate> chain = new ArrayList<>();
// Получаем цепочку сертификатов.
List<Certificate> lChain = Arrays.asList(jks.getCertificateChain(alias));
// Конвертируем цепочку в X509Certificate.
Collection<X509Certificate> xChain = Arrays.asList((lChain).toArray(new X509Certificate[lChain.size()]));
chain.addAll(xChain);
//Создаем CAdES подпись.
CAdESSignature cadesSignature = new CAdESSignature(false); //detached = false
cadesSignature.setCertificateStore(null);
cadesSignature.setCRLStore(null);
cadesSignature.addSigner(
JCP.PROVIDER_NAME
, getDigestOid(privateKey)
, getPublicKeyOid(privateKey)
, privateKey
, chain
, CAdESType.CAdES_BES
, null
, false);
И здесь падает ошибка Could not determine revocation status: unable to find valid certification path to requested target; error codes: [44] 'Certificate status is unknown or revoked' Была идея в cadesSignature.setCRLStore(null); передать списки отзыва из файла для этого я пыталась скачать, сложить crls в папку и оттуда их загрузить: Код:
private Set<X509CRL> getCRLsFromFolder(String folderName) throws Exception {
Set<X509CRL> result = new HashSet<>();
CertificateFactory cf = CertificateFactory.getInstance("X509");
try {
List<Path> files = Files.walk(Paths.get(folderName))
.filter(Files::isRegularFile)
.collect(Collectors.toList());
for (Path path : files) {
X509CRL crl;
String contents = new String(Files.readAllBytes(path));
System.out.println("CRL contents: " + contents);
//contents = new String(Base64.getDecoder().decode(contents), "UTF-8");//эксперименты с кодировками
try (InputStream in = new ByteArrayInputStream(contents.getBytes()) ){
crl = (X509CRL)cf.generateCRL(in);
result.add(crl);
}
}
} catch (Exception e) {
throw new Exception("Failed to retrieve any certificates from the input file", e);
}
return result;
}
На строке crl = (X509CRL)cf.generateCRL(in); валится ошибка java.security.cert.CRLException: Empty input Я нашла, что причина может быть в кодировке, но base64 не подошло.. Не уверена, что вообще двигаюсь в правильном направлении Подскажите, пожалуйста, что делать. Время идет, начальство сердится Сертификаты отправила (см. ЛС)
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,006  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
не могли бы вы приложить или прислать также промежуточные сертификаты (в сертификате нет ссылки на них)? Спасибо. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 27.02.2013(UTC) Сообщений: 38  Откуда: Москва Сказал(а) «Спасибо»: 14 раз Поблагодарили: 11 раз в 9 постах
|
Добрый день! Промежуточные сертификаты:  certificates.zip (160kb) загружен 5 раз(а).На всякий случай продублировала в почту
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,006  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Причина ошибки установлена экспериментально: достаточно скачать CRL по ссылке в сертификате и открыть его. Собственно, вы об этом тоже писали. Он окажется в кодировке BASE64, но без строк -----BEGIN ... и -----END ... в конце. Такой CRL не может быть обработан в java стандартными средствами, при декодировании требуется, чтобы указанные строки были, если это BASE64, или чтобы их не было, но данные были в DER (чего нет). Проверяется так: сначала, как есть, скачанный файл, а потом он же, но с предварительно добавленными руками строками - Код:
X509CRL crl = (X509CRL) CertificateFactory.getInstance("X.509").generateCRL(new FileInputStream("my.crl"));
System.out.println(crl);
P.S. Ошибку декодирования также можно было увидеть, включив JCPLogger с уровнем ALL. Отредактировано пользователем 30 мая 2019 г. 14:48:20(UTC)
| Причина: Не указана |
|
 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 27.02.2013(UTC) Сообщений: 38  Откуда: Москва Сказал(а) «Спасибо»: 14 раз Поблагодарили: 11 раз в 9 постах
|
Т.к. списки отзыва опубликованы неправильно, мы попробуем сослаться на стандарт https://tools.ietf.org/html/rfc7468но не уверена, что нас услышат.. В обход нужно попытаться сделать подпись, исправляя файл СОС локально нам придется скачивать СОС, складывать в папку и подставлять нужные заголовки но почему снова не получилось подписать? Код:
//так читаем CRL из файлов
private CollectionStore getCRLsFromFolder(String folderName) throws Exception {
Set<X509CRLHolder> crlList = new HashSet<>();
try {
List<Path> files = Files.walk(Paths.get(folderName))
.filter(Files::isRegularFile)
.collect(Collectors.toList());
for (Path path : files) {
try (PEMParser pemParser = new PEMParser(new FileReader(path.toFile().getAbsolutePath())) ){
X509CRLHolder crlHolder = (X509CRLHolder) pemParser.readObject();
if (crlHolder != null)
crlList.add(crlHolder);
}
}
} catch (Exception e) {
throw new Exception("Failed to retrieve any crl from folder " + folderName, e);
}
return new CollectionStore(crlList);
}
//и затем пытаемся подставить crl в метод подписания, чтобы читался именно наш исправленный СОС
System.setProperty("com.sun.security.enableCRLDP", "false"); //пробовала true и false - результат одинаковый
System.setProperty("ocsp.enable", "false"); //пробовала true и false - результат одинаковый
CAdESSignature cadesSignature = new CAdESSignature(false); //detached = false
cadesSignature.setCertificateStore(null);
CollectionStore crlStore = getCRLsFromFolder("...\\crl");
cadesSignature.setCRLStore(crlStore);
cadesSignature.addSigner(
JCP.PROVIDER_NAME
, getDigestOid(privateKey)
, getPublicKeyOid(privateKey)
, privateKey
, chain
, CAdESType.CAdES_BES
, null
, false);
Метод падает с ошибкой Цитата: 2019-05-30 17:27:06 java.util.logging.LoggingProxyImpl.log - Could not create windows registry node Software\JavaSoft\Prefs\ru\/Crypto/Pro\/Ad/E/S at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5. 2019-05-30 17:27:06 java.util.logging.LoggingProxyImpl.log - Trying to recreate Windows registry node Software\JavaSoft\Prefs\ru\/Crypto/Pro\/Ad/E/S at root 0x80000002. 2019-05-30 17:27:06 java.util.logging.LoggingProxyImpl.log - Could not open windows registry node Software\JavaSoft\Prefs\ru\/Crypto/Pro\/Ad/E/S at root 0x80000002. Windows RegOpenKey(...) returned error code 2. 2019-05-30 17:27:06 r.C.JCP.tools.logger.BasicLogger.pref - System Preference Node: /ru/CryptoPro/AdES.AdESConfigParameters_desync_class_default=-1 2019-05-30 17:27:10 r.C.JCP.tools.logger.BasicLogger.error - For online validation by CRLDP parameter 'com.sun.security.enableCRLDP' (Oracle) or 'com.ibm.security.enableCRLDP' (IBM) must be set 'true' to enable or 'ocsp.enable' must be set 'true' (OCSP), or CRL passed for offline validation
Я передала ему crl, что пошло не так? java-csp-5.0.40277
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,006  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Код:cadesSignature.setCRLStore(crlStore);
- это не совсем то. Данная функция добавляет CRL в подпись, но не использует при создании (описание есть в CAdES-javadoc). Нужно передать список CRL в addSigner(), их несколько - таких функций, одна из них принимает список CRL. А Код:
System.setProperty("com.sun.security.enableCRLDP", "false"); //пробовала true и false - результат одинаковый
System.setProperty("ocsp.enable", "false"); //пробовала true и false - результат одинаковый
можно не использовать, они и так false по умолчанию. К тому же, enableCRLDP просто означает, пытаться ли загрузить CRL по ссылкам в сертификате из сети, а ocsp.enable - использовать ли OCSP (AIA в сертификате), и последнему нужно больше параметров (в таком виде его недостаточно). Отредактировано пользователем 31 мая 2019 г. 9:12:26(UTC)
| Причина: Не указана |
|
 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 27.02.2013(UTC) Сообщений: 38  Откуда: Москва Сказал(а) «Спасибо»: 14 раз Поблагодарили: 11 раз в 9 постах
|
Добрый день! Передала в addSigner список crl, он не пуст  Но почему-то ошибка та же Цитата: For online validation by CRLDP parameter 'com.sun.security.enableCRLDP' (Oracle) or 'com.ibm.security.enableCRLDP' (IBM) must be set 'true' to enable or 'ocsp.enable' must be set 'true' (OCSP), or CRL passed for offline validation; error codes: [44] 'Certificate status is unknown or revoked'
Отредактировано пользователем 31 мая 2019 г. 10:54:29(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,006  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Включите логирование для JCPLogger с уровнем ALL, как это сделать - есть в портале техподдержки, раздел JCP. |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,006  Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 715 раз в 675 постах
|
Вы только 1 CRL передали? Сертификатов ведь 3 (минус 1 корневой, итого 2 на проверку). Включите тогда enableCRLDP в true, чтобы один CRL (если с ним нет тех же проблем с base64), которого нет, мог загрузиться. Отредактировано пользователем 31 мая 2019 г. 11:20:54(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 27.02.2013(UTC) Сообщений: 38  Откуда: Москва Сказал(а) «Спасибо»: 14 раз Поблагодарили: 11 раз в 9 постах
|
Параметры настроены согласно документации Код:
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
ru.CryptoPro.ssl.SSLLogger.level = ALL
Полный лог подписания такой (он просто уже был приложен в посте ранее, я не догадалась продублировать) Цитата: 2019-05-31 11:18:24 java.util.logging.LoggingProxyImpl.log - Could not create windows registry node Software\JavaSoft\Prefs\ru\/Crypto/Pro\/Ad/E/S at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5. 2019-05-31 11:18:24 java.util.logging.LoggingProxyImpl.log - Trying to recreate Windows registry node Software\JavaSoft\Prefs\ru\/Crypto/Pro\/Ad/E/S at root 0x80000002. 2019-05-31 11:18:24 java.util.logging.LoggingProxyImpl.log - Could not open windows registry node Software\JavaSoft\Prefs\ru\/Crypto/Pro\/Ad/E/S at root 0x80000002. Windows RegOpenKey(...) returned error code 2. 2019-05-31 11:18:24 r.C.JCP.tools.logger.BasicLogger.pref - System Preference Node: /ru/CryptoPro/AdES.AdESConfigParameters_desync_class_default=-1
java.lang.Exception: Cannot sign message at ru.mdi.... Caused by: For online validation by CRLDP parameter 'com.sun.security.enableCRLDP' (Oracle) or 'com.ibm.security.enableCRLDP' (IBM) must be set 'true' to enable or 'ocsp.enable' must be set 'true' (OCSP), or CRL passed for offline validation; error codes: [44] 'Certificate status is unknown or revoked', at ru.CryptoPro.CAdES.cl_1.addSigner(Unknown Source) at ru.mdi.irmdev.tas.service.impl.CAdESServiceImpl.signMessage(CAdESServiceImpl.java:120) ... 22 more Caused by: For online validation by CRLDP parameter 'com.sun.security.enableCRLDP' (Oracle) or 'com.ibm.security.enableCRLDP' (IBM) must be set 'true' to enable or 'ocsp.enable' must be set 'true' (OCSP), or CRL passed for offline validation; error codes: [44] 'Certificate status is unknown or revoked', at ru.CryptoPro.AdES.certificate.BaseCertificateChainValidatorImpl.validate(Unknown Source) at ru.CryptoPro.AdES.certificate.BaseCertificateChainValidatorImpl.validate(Unknown Source) at ru.CryptoPro.AdES.certificate.BaseCertificateChainValidatorImpl.validate(Unknown Source) ... 24 more Caused by: java.security.cert.CertPathValidatorException: Could not determine revocation status at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(Unknown Source) at sun.security.provider.certpath.PKIXCertPathValidator.validate(Unknown Source) at sun.security.provider.certpath.PKIXCertPathValidator.validate(Unknown Source) at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(Unknown Source) at java.security.cert.CertPathValidator.validate(Unknown Source) at ru.CryptoPro.reprov.CPCertPathValidator.engineValidate(Unknown Source) at java.security.cert.CertPathValidator.validate(Unknown Source) ... 27 more Caused by: java.security.cert.CertPathValidatorException: Could not determine revocation status at ru.CryptoPro.reprov.certpath.CrlRevocationChecker.a(Unknown Source) at ru.CryptoPro.reprov.certpath.CrlRevocationChecker.a(Unknown Source) at ru.CryptoPro.reprov.certpath.CrlRevocationChecker.a(Unknown Source) at ru.CryptoPro.reprov.certpath.CrlRevocationChecker.a(Unknown Source) at ru.CryptoPro.reprov.certpath.CrlRevocationChecker.a(Unknown Source) at ru.CryptoPro.reprov.certpath.CrlRevocationChecker.a(Unknown Source) at ru.CryptoPro.reprov.certpath.CrlRevocationChecker.check(Unknown Source) ... 34 more
Установка JCP производилась под учетной записью администратора Отредактировано пользователем 31 мая 2019 г. 11:27:31(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close