Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

3 Страницы<123>
Опции
К последнему сообщению К первому непрочитанному
Offline what_is_it@inbox.ru  
#11 Оставлено : 28 мая 2019 г. 19:13:16(UTC)
what_is_it@inbox.ru

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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 не подошло..

Не уверена, что вообще двигаюсь в правильном направлении
Подскажите, пожалуйста, что делать. Время идет, начальство сердится
Сертификаты отправила (см. ЛС)
Offline Евгений Афанасьев  
#12 Оставлено : 29 мая 2019 г. 14:51:51(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,926
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
не могли бы вы приложить или прислать также промежуточные сертификаты (в сертификате нет ссылки на них)? Спасибо.
Offline what_is_it@inbox.ru  
#13 Оставлено : 30 мая 2019 г. 10:28:08(UTC)
what_is_it@inbox.ru

Статус: Активный участник

Группы: Участники
Зарегистрирован: 27.02.2013(UTC)
Сообщений: 38
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 14 раз
Поблагодарили: 11 раз в 9 постах
Добрый день!
Промежуточные сертификаты:
certificates.zip (160kb) загружен 4 раз(а).
На всякий случай продублировала в почту
Offline Евгений Афанасьев  
#14 Оставлено : 30 мая 2019 г. 11:42:35(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,926
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Причина ошибки установлена экспериментально: достаточно скачать 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)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
what_is_it@inbox.ru оставлено 30.05.2019(UTC)
Offline what_is_it@inbox.ru  
#15 Оставлено : 30 мая 2019 г. 18:07:53(UTC)
what_is_it@inbox.ru

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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
Offline Евгений Афанасьев  
#16 Оставлено : 31 мая 2019 г. 9:11:38(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,926
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Код:
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)  | Причина: Не указана

thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
what_is_it@inbox.ru оставлено 31.05.2019(UTC)
Offline what_is_it@inbox.ru  
#17 Оставлено : 31 мая 2019 г. 10:52:20(UTC)
what_is_it@inbox.ru

Статус: Активный участник

Группы: Участники
Зарегистрирован: 27.02.2013(UTC)
Сообщений: 38
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 14 раз
Поблагодарили: 11 раз в 9 постах
Добрый день!
Передала в addSigner список crl, он не пуст

UserPostedImage

Но почему-то ошибка та же

Цитата:

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)  | Причина: Не указана

Offline Евгений Афанасьев  
#18 Оставлено : 31 мая 2019 г. 10:59:22(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,926
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Включите логирование для JCPLogger с уровнем ALL, как это сделать - есть в портале техподдержки, раздел JCP.
Offline Евгений Афанасьев  
#19 Оставлено : 31 мая 2019 г. 11:19:54(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,926
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 691 раз в 652 постах
Вы только 1 CRL передали? Сертификатов ведь 3 (минус 1 корневой, итого 2 на проверку). Включите тогда enableCRLDP в true, чтобы один CRL (если с ним нет тех же проблем с base64), которого нет, мог загрузиться.

Отредактировано пользователем 31 мая 2019 г. 11:20:54(UTC)  | Причина: Не указана

Offline what_is_it@inbox.ru  
#20 Оставлено : 31 мая 2019 г. 11:25:28(UTC)
what_is_it@inbox.ru

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы<123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.