Статус: Новичок
Группы: Участники
Зарегистрирован: 06.02.2017(UTC) Сообщений: 5 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Москва
|
![](/forum2/Themes/soclean/icon_file.gif) 1.png (64kb) загружен 11 раз(а).![](/forum2/Themes/soclean/icon_file.gif) 3.png (33kb) загружен 11 раз(а).![](/forum2/Themes/soclean/icon_file.gif) 2.png (34kb) загружен 10 раз(а).![](/forum2/Themes/soclean/icon_file.gif) Certificates_of_tax_services.7z (3kb) загружен 4 раз(а).Добрый день! Разрабатываю сервер для подписи/шифрования документов на основе java8,JCP и glassfish. Есть 4 сертификата, которые я хочу положить в хранилище доверенных сертификатов и на которые потом шифровать документы. Сертификаты отправляются из другой системы по http. При попытке их загрузить, 2 сертификата проходят, а при обработке IFNS_6320_20150903_20160903.cer получаю ошибку при преобразовании массива байтов в сертификат: Код:
java.security.cert.CertificateParsingException: java.io.IOException: subject key, null
java.security.InvalidKeyException
public static X509Certificate GetCertificateFromBytes(byte[] bytes) throws CertificateException {
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
return (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(bytes));
}
Прогрузились сертификаты IFNS_6320_20160406_20170406.cer и IFNS_6320_20141112_20151112.cer. При сравнении сертификата из файла и того что попал в контейнер видно что сертификат прогрузился некорректно. Сделал экспорт этого серта из хранилища, чтоб лучше было сравнивать, поменялось куча полей, в том числе и отпечаток. Загружаю сертификаты в хранилище вот так: Код:
public static String LoadCertToCertStore(Certificate cert, String alias, String store_path)
throws CryptoServiceException {
try {
File file_cs = new File(store_path);
KeyStore keystore = KeyStore.getInstance("CertStore");
keystore.load(new FileInputStream(file_cs), Config.getPasswordFNSCertStore());
keystore.setCertificateEntry(alias, cert);
keystore.store( new FileOutputStream(file_cs), Config.getPasswordFNSCertStore() );
return "success";
} catch (Exception e) {
e.printStackTrace();
throw new CryptoServiceException("LoadCertToCertStores error." + e.getMessage());
}
}
Сертификаты и скриншоты приложил к сообщению.
Вопросы:1.Почему сертификат IFNS_6320_20150903_20160903.cer не преобразовался должным образом? 2.Почему сертификаты прогружаются некорректно? 3.Как запустить ContrlolPane на русском?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Сертификат получен по http в неправильном виде и не устанавливается или он из хранилища доверенных сертификатов извлекается в неправильном виде? |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Попробуйте так, у меня 4 сертификата из архива успешно записались (проверок нет): Код:
public static void main(String[] args) throws Exception {
if (args.length == 0) {
System.out.println("Usage: <cert_store_path> <cert_store_password> <cert_file> <alias>");
return;
}
String certStorePath = args[0];
char[] certStorePassword = (args[1] != null && args[1].length() > 0) ? args[1].toCharArray() : null;
String certPath = args[2];
String certAlias = args[3];
File certStoreFile = new File(certStorePath);
KeyStore keyStore = KeyStore.getInstance(JCP.CERT_STORE_NAME, JCP.PROVIDER_NAME);
if (certStoreFile.exists()) {
System.out.println("Loading certificate store...");
FileInputStream storeInputStream = new FileInputStream(certStoreFile);
keyStore.load(storeInputStream, certStorePassword);
storeInputStream.close();
} // if
else {
System.out.println("Creating certificate store...");
keyStore.load(null, null);
} // else
X509Certificate cert = (X509Certificate) CertificateFactory
.getInstance("X.509").generateCertificate(new FileInputStream(certPath));
System.out.println("Saving certificate...");
keyStore.setCertificateEntry(certAlias, cert);
FileOutputStream storeOutputStream = new FileOutputStream(certStoreFile);
keyStore.store(storeOutputStream, certStorePassword);
storeOutputStream.close();
System.out.println("Completed!");
Enumeration<String> aliases = keyStore.aliases();
while (aliases.hasMoreElements()) {
String alias = aliases.nextElement();
X509Certificate certificate = (X509Certificate) keyStore.getCertificate(alias);
System.out.println("$ " + alias + ": ");
System.out.println("subject: " + certificate.getSubjectDN());
System.out.println("issuer: " + certificate.getIssuerDN());
System.out.println("--------------------------------------");
} // while
}
Код выполнялся поочередно для каждого сертификата, при первой записи хранилище создалось. |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Автор: Efim163 ![Перейти к цитате Перейти к цитате](/forum2/Themes/soclean/icon_latest_reply.gif) 3.Как запустить ContrlolPane на русском? Попробуйте так: <JRE>/bin/java -Dfile.encoding=cp866 ru.CryptoPro.JCP.ControlPane.MainControlPane |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 06.02.2017(UTC) Сообщений: 5 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Москва
|
Спасибо за ответы. В общем, всё дело было в преобразовании тела запроса в массив байтов, а потом в преобразовании этого массива в во входной поток и сертификат. Переделал функционал на преобразовании тела запроса в поток и преобразование сразу потока в сертификат и все заработало. Код:
public static X509Certificate GetCertificateFromInputStream(InputStream inputStream) throws CertificateException, CryptoServiceException {
try {
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
return (X509Certificate) certFactory.generateCertificate(inputStream);
}catch (Exception e) {
e.printStackTrace();
throw new CryptoServiceException("GetCertificateFromInputStream.Cert not found" + e.getMessage());
}
}
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close