Статус: Участник
Группы: Участники
Зарегистрирован: 29.11.2021(UTC) Сообщений: 21
Сказал(а) «Спасибо»: 10 раз Поблагодарили: 2 раз в 1 постах
|
Здравствуйте. Работаю с версией JCP 2.0.40035. Есть следующий код (бОльшая его часть взята в samples-sources.jar из примера OCSPValidateCert):
Код: System.setProperty("ru.CryptoPro.reprov.enableCRLDP", "false");
System.setProperty("com.sun.security.enableCRLDP", "false");
System.setProperty("com.ibm.security.enableCRLDP", "false");
System.setProperty("ocsp.enable", "false");
System.setProperty("com.sun.net.ssl.checkRevocation", "false");
// Считываем прикреплённую (attached) gjlgbcm
FileInputStream cadesCms = new FileInputStream("signature.p7s");
// Извлекаем сертификат пользователя из подписи
// ???
// читаем сертификаты из cacerts
String pathToKeyStore = System.getProperty("java.home") + File.separatorChar + "lib" + File.separatorChar + "security" + File.separatorChar + "cacerts";
char[] keyStorePassword = "changeit".toCharArray();
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(new FileInputStream(pathToKeyStore), keyStorePassword);
Enumeration<String> alias = keyStore.aliases();
Map<String, X509Certificate> cacerts = new LinkedHashMap<>();
while (alias.hasMoreElements()) {
X509Certificate certificate = (X509Certificate) keyStore.getCertificate(alias.nextElement());
Vector values = PrincipalUtil.getSubjectX509Principal(certificate).getValues(X509Name.CN);
if (values.size() > 0) {
cacerts.put((String) values.get(0), certificate);
}
}
// Сертификаты пользователя и корневой
// final Certificate crt = // ???
final Certificate tr = cacerts.get("УЦ КРИПТО-ПРО (ГОСТ 2012)");
//Сертификаты (в данном случае корневой и пользователя, выданный УЦ)
final Certificate[] certs = new Certificate[2];
certs[0] = crt;
certs[1] = tr; //root
final Set trust = new HashSet(0);
trust.add(new TrustAnchor((X509Certificate) tr, null));
final List cert = new ArrayList(0);
for (int i = 0; i < certs.length; i++) {
cert.add(certs[i]);
}
//Параметры
final PKIXBuilderParameters cpp = new PKIXBuilderParameters(trust, null);
cpp.setSigProvider(null);
final CollectionCertStoreParameters par =
new CollectionCertStoreParameters(cert);
final CertStore store = CertStore.getInstance("Collection", par);
cpp.addCertStore(store);
final X509CertSelector selector = new X509CertSelector();
selector.setCertificate((X509Certificate) crt);
cpp.setTargetCertConstraints(selector);
// - списки отзывов
Set<X509CRL> crlListForCheck = new HashSet<>();
X509CRL crl_ = (X509CRL) CertificateFactory.getInstance("X.509").generateCRL(new FileInputStream("1.crl"));
crlListForCheck.add(crl_);
final CollectionCertStoreParameters parCrl = new CollectionCertStoreParameters(crlListForCheck); //certs
// создание специального хранилища отзывов сертификатов на основе
// параметров, определенных списком сертификатов
final CertStore storeCrl = CertStore.getInstance("Collection", parCrl);
cpp.addCertStore(storeCrl);
//2) построение цепочки
//б) без проверки crl
cpp.setRevocationEnabled(false);
// Устанавливаем дату, актуальную для CRL и сертификатов
cpp.setDate(getActualDate());
final PKIXCertPathBuilderResult res =
(PKIXCertPathBuilderResult) CertPathBuilder.
getInstance("CPPKIX", "RevCheck").build(cpp);
final CertPath cp = res.getCertPath();
//Проверка
final CertPathValidator cpv = CertPathValidator.getInstance("CPPKIX", "RevCheck");
cpp.setRevocationEnabled(true);
cpv.validate(cp, cpp);
Если кратко, то пытаюсь сделать следующее: - получаю подпись (PKCS#7 attached), из которой нужно извлечь контент - подписанные данные (извлекаю из InputStream contentStream = cadesSignature.getSignedContent(); - с этим проблем нет, поэтому в коде не отобразил), а также верифицировать подпись; - т.к. на некоторых стендах сеть закрытая и не будет возможности обновлять CRL, то пришлось выставлять дату, актуальную для имеющегося списка CRL и сертификатов (строка кода 73) - корневой (он же промежуточный, т.к. цепочка сертификатов состоит только из сертификата УЦ и пользовательского) сертификат загружен в cacerts - хранилище доверенных сертификатов. Когда загружаю туда ещё и пользовательский (извлекал его из подписи с помощью КриптоАРМ и загружал с помощью keytool), а затем считываю оба сертификата, то код работает - валидация цепочки сертификатов (строка кода 82) происходит без ошибок. Проблема в том, что не получилось найти ни на форуме, ни в примерах из samples-sources.jar, каким образом можно извлечь пользовательский сертификат из файла подписи (строки кода 11 и 31)? Пытался извлечь с помощью cadesSignature.getCertificateStore(), но возвращается null. Прошу помощи (может есть пример или кусок кода)
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 29.11.2021(UTC) Сообщений: 21
Сказал(а) «Спасибо»: 10 раз Поблагодарили: 2 раз в 1 постах
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close