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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Алексей Черенцов  
#1 Оставлено : 21 июля 2020 г. 12:33:52(UTC)
Алексей Черенцов

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

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

Сказал(а) «Спасибо»: 14 раз
Здравствуйте!

Вчера возникла проблема, при добавлении в java-программе корневых сертификатов в cacerts командой
Код:
keyStore.store(new FileOutputStream(fileName), "changeit".toCharArray());
по непонятной причине возник сбой, в результате которого закосячился cacerts. Файл не открывался средствами JCP. Пришлось восстанавливать его с дистрибутива. Для предотвращения таких проблем в дальнейшем, подумалось, что логично программе иметь своё хранилище доверенных сертификатов, которое при старте программы я мог бы создавать из доверенных сертификатов полученных из БД. Но я нигде в документации не нашёл как JCP указать на свой временный cacerts.
Вобще-то и раньше возникали вопросы к добавлению корневых сертификатов в cacerts. В линуксе по-умолчанию у этого файла права только у root. Соответственно если мы хотим программе дать права добавлять корневые надо либо дать права рута программе, либо дать права на запись на cacerts для остальных пользователей. Как-то это не удобно для распространения по пользователям, да и у админов возникают вопросы - чего это вы тут права раздаёте?
Я тут на форуме нашёл аналогичный вопрос восмилетней давности - тогда такого функционала не было. А как сейчас, можно ли JCP указать расположение cacerts?

Отредактировано пользователем 21 июля 2020 г. 12:42:41(UTC)  | Причина: Не указана

Online Санчир Момолдаев  
#2 Оставлено : 21 июля 2020 г. 12:44:50(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 88 раз
Поблагодарили: 226 раз в 213 постах
Добрый день!
cacerts - это хранилище типа Java Key Store (JKS)
в JCP в панели или через keytool можно создать хранилище типа CertStore
в панели JCP вы JKS никак не откроете. только через keytool
пути можете указывать сами.
в методы где принимают сеты цепочек их и передавайте (загруженные к примеру из CertStore)
Техническую поддержку оказываем тут
Наша база знаний
Offline Алексей Черенцов  
#3 Оставлено : 22 июля 2020 г. 4:59:29(UTC)
Алексей Черенцов

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

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

Сказал(а) «Спасибо»: 14 раз
Автор: Санчир Момолдаев Перейти к цитате
Добрый день!
cacerts - это хранилище типа Java Key Store (JKS)
в JCP в панели или через keytool можно создать хранилище типа CertStore

Файлы типа CertStore используем для распространения клиентам наборов прикладных и корневых сертификатов.

Автор: Санчир Момолдаев Перейти к цитате

в панели JCP вы JKS никак не откроете. только через keytool
пути можете указывать сами.


JCP может создавать JKS через KeyStore:
Код:
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(null, null);
//заливаем в него корневые сертификаты
keyStore.store(new FileOutputStream(fileName), password.toCharArray());

Я и подумал, что раз можем создать свой JKS, то может и сможем сокормить его JCP вместо стандартного cacerts.

Автор: Санчир Момолдаев Перейти к цитате

в методы где принимают сеты цепочек их и передавайте (загруженные к примеру из CertStore)


Вот допустим команда подписания:

Код:
cadesSignature.addSigner(JCP.PROVIDER_NAME, keyState.getDigest(), keyState.getPublickeyOID(),
    keyState.getPk(), keyState.getCerts(), CAdESType.CAdES_BES, null, false,
    new AttributeTable(table), null, cryptoState.getCrlList());


getCerts() выдаёт List<X509Certificate> из двух элементов. В котором 0 элемент - это сертификат подписанта, а первый элемент - сертификат его издателя (это сертификат вашего тестового УЦ). В ответ на мою попытку подписания (без заполненного cacerts) cadesSignature выдаёт ошибку:
Код:

Caused by: ru.CryptoPro.AdES.exception.AdESException: Root certificate: sn 3b208ae5fd46688649a050faafa88393, subject CN="Тестовый УЦ ООО \"КРИПТО-ПРО\"", O="ООО \"КРИПТО-ПРО\"", L=Москва, ST=г. Москва, C=RU, STREET=ул. Сущёвский вал д. 18, OID.1.2.643.3.131.1.1=#120C303031323334353637383930, OID.1.2.643.100.1=#120D31323334353637383930313233, issuer CN="Тестовый УЦ ООО \"КРИПТО-ПРО\"", O="ООО \"КРИПТО-ПРО\"", L=Москва, ST=г. Москва, C=RU, STREET=ул. Сущёвский вал д. 18, OID.1.2.643.3.131.1.1=#120C303031323334353637383930, OID.1.2.643.100.1=#120D31323334353637383930313233 is untrusted
	at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.validateIfRootCertificateInTrustStoreAndAddToChain(Unknown Source) ~[ades_core_a-40621.0.jar:40621-A]
	at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source) ~[ades_core_a-40621.0.jar:40621-A]
	at ru.CryptoPro.AdES.certificate.CertificateChainBuilderImpl.build(Unknown Source) ~[ades_core_a-40621.0.jar:40621-A]
	... 58 common frames omitted

То есть не смотря на то, что ей на вход подали полную цепочку сертификатов, JCP не считает, что стоит доверять корневому. Либо я что-то не то делаю, либо схема с полными цепочками всё равно без заполненного cacerts не работает.

Отредактировано пользователем 22 июля 2020 г. 5:47:52(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#4 Оставлено : 22 июля 2020 г. 8:14:03(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
Здравствуйте. JKS - формат Sun, отношения к JCP не имеет. Корневые сертификаты при использовании кадеса должны быть установлены в cacerts.
Offline Алексей Черенцов  
#5 Оставлено : 22 июля 2020 г. 9:16:40(UTC)
Алексей Черенцов

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

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

Сказал(а) «Спасибо»: 14 раз
Здравствуйте, Евгений.

Давайте подытожим, а то вдруг я что-то не так понял:
1) Для работы функций JCP по подписанию и проверки подписей обязательно нужно иметь корневой сертификат сохранённым в cacerts. Механизмов подписать или проверить подпись без использования cacerts - не существует.
2) JCP работает только с файлом cacerts расположенным по-умолчанию. Указать ему путь какой-нибудь функцией аналогичной:
System.setProperty("javax.net.ssl.trustStore", fileName);
возможности нет.

Правильно или я где-то напутал?
Offline Евгений Афанасьев  
#6 Оставлено : 22 июля 2020 г. 9:36:20(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
Автор: Алексей Черенцов Перейти к цитате

1) Для работы функций JCP по подписанию и проверки подписей обязательно нужно иметь корневой сертификат сохранённым в cacerts. Механизмов подписать или проверить подпись без использования cacerts - не существует.

Точнее, не JCP, а CAdES/XAdES. При создании/проверке подписи этого формата корневые, участвующие в процессе, должны быть установлены в cacerts, как в случае использование плагина в браузере корневые ставят в Root. Да, это единственный правильный способ.

Автор: Алексей Черенцов Перейти к цитате

2) JCP работает только с файлом cacerts расположенным по-умолчанию. Указать ему путь какой-нибудь функцией аналогичной:
System.setProperty("javax.net.ssl.trustStore", fileName);
возможности нет.

Да, CAdES/XAdES используют файл cacerts из JRE/lib/security. Другой путь указать нельзя.

Offline basid  
#7 Оставлено : 22 июля 2020 г. 12:34:29(UTC)
basid

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

Группы: Участники
Зарегистрирован: 21.11.2010(UTC)
Сообщений: 1,042

Сказал(а) «Спасибо»: 7 раз
Поблагодарили: 140 раз в 126 постах
JFYI: JEP 229: Create PKCS12 Keystores by Default:
Код:
Scope	SE
Status	Closed / Delivered
Release	9
Component	security-libs / java.security
Offline Евгений Афанасьев  
#8 Оставлено : 22 июля 2020 г. 12:43:47(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
Спасибо, учтем информацию.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.