Ошибка при получении сертификата java

I am trying to use Java to read a certificate that I received from an external party. The code is throwing the following error:

java.lang.RuntimeException: java.security.cert.CertificateException: Unable to initialize, java.io.IOException: extra data given to DerValue constructor

The code:

FileInputStream ksfis = new FileInputStream(this.getCertificateFile());
ksbufin = new BufferedInputStream(ksfis);
certificate = (X509Certificate)
  CertificateFactory.getInstance("X.509").generateCertificate(ksbufin);

To make sure the problem was not in the code, I created a self-signed certificate and used it with the code, and it worked fine. I have installed both certificates in the system key chain, and they both are valid. I am using a Mac and Java 1.6.

Any idea why I get the above exception when I load the external Party certificate? Do you think it got corrupted during transfer? If it did, it should not show up as valid on the local system, right?

Pops's user avatar

Pops

30.1k37 gold badges135 silver badges151 bronze badges

asked Jul 23, 2012 at 22:22

Java's user avatar

8

Try to type this using openssl, and then import the result:

openssl x509 -outform der -in certificate.pem -out certificate.der

or use the Java Bouncy Castle functionality in the lightweight API:

http://www.bouncycastle.org/docs/pkixdocs1.5on/org/bouncycastle/openssl/PEMReader.html

You may encode the result again and then use the "X509" CertificateBuilder in Java to get a JCE defined certificate, e.g.

ByteArrayInputStream certStream  =  new ByteArrayInputStream(binaryCert);
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(certStream);

answered Jul 23, 2012 at 22:30

Maarten Bodewes - on strike's user avatar

3

Обновлено 26.06.2018

Ошибка Java Failed to validate certificate. The application will not be executed-01

Добрый день уважаемые читатели блога pyatilistnik.org, сегодня я хочу рассказать о проблеме, с которой я столкнулся, где при попытке попасть на веб морду одного из fc свичей получил ошибку Java Failed to validate certificate. The application will not be executed. Давайте смотреть как ее исправить и попасть в веб интерфейс свитчей.

Как исправить ошибки java Failed to validate certificate

Давайте посмотрим само предупреждение и разберем как исправить ошибки java. В окне ошибки вы видите, что найдена не подписанная запись ресурса.

Ошибка Java Failed to validate certificate. The application will not be executed-02

Ошибка Java Failed to validate certificate. The application will not be executed-02

Немного погуглив нашел несколько решений.

  • Идем в панель управления-java. Ее можно найти в панели управления Windows.

Ошибка Java Failed to validate certificate. The application will not be executed-03

Ошибка Java Failed to validate certificate. The application will not be executed-03

Жмем Settings.

Ошибка Java Failed to validate certificate. The application will not be executed-04

Ошибка Java Failed to validate certificate. The application will not be executed-04

и чистим кэш. Для этого нажимаем Delete Files.
Мне не помогло.

  • 2 способ. Удаляем с помощью ccleaner все java что есть на компе, чистим реестр и все остатки файлов.

Ошибка Java Failed to validate certificate. The application will not be executed-05

Ошибка Java Failed to validate certificate. The application will not be executed-05

переустанавливаем. У меня до этого стояла java 6.45 поставил версию поменьше.

ЕЩЕ ОЧЕНЬ ВАЖНО ИСПОЛЬЗОВАТЬ 32 БИТНУЮ ВЕРСИЮ JAVA.

  • 3 причина ошибки Failed to validate certificate. The application will not be executed, идет файл java.security. Данный файл содержит в себе, настройки безопасности, его найти можно вот по такому пути

C:Program FilesJavaверсияlibsecurity для 64x версий, для x86 путь такой C:Program Files (x86)Javajre7libsecurity

Failed to validate certificate

Щелкаем по java.security правым кликом и выбираем открыть с помощью текстового редактора или блокнота,  находим там вот такую строку

jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024

java.security

И редактируем ее вот к такому виду

jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 256

После этого вы больше не увидите подобных ошибок в вашей операционной системе.

Июн 26, 2018 23:06

This website, https://dcs1.noaa.gov, recently updated their SSL certification. Since that change I cannot grab a file from there that I need. I get the following error:

--08:37:12--  https://dcs1.noaa.gov/pdts_compressed.txt
           => `pdts_compressed.txt'
Resolving dcs1.noaa.gov... 205.156.2.181
Connecting to dcs1.noaa.gov|205.156.2.181|:443... connected.
ERROR: Certificate verification error for dcs1.noaa.gov: unable to get local issuer certificate
To connect to dcs1.noaa.gov insecurely, use `--no-check-certificate'.
Unable to establish SSL connection.

I am running Red Hat Linux 4.x and updated all the openssl packages. The usual process I use to access this file is running in Java and uses URL.openStream() to read the file. The command wget also does not work so I am assuming that it is an SSL problem and not a java problem.

asked Nov 10, 2011 at 14:53

Mel's user avatar

1

the cert is issued by Verisign, probably their root cert is in your servers root cert store. Open the webpage from your machine from a browser and you will see the cert is valid. You can also try to wget from another machine and it will work too.

answered Nov 10, 2011 at 15:01

Peter Szanto's user avatar

Peter SzantoPeter Szanto

7,4982 gold badges50 silver badges53 bronze badges

1

Probably, the new server certificate is issued by an issuing authority that is not trusted by you. You need to import the issuing authority’s certificate in your truststore.

answered Nov 10, 2011 at 16:07

Drona's user avatar

DronaDrona

6,8081 gold badge28 silver badges35 bronze badges

You could try testing the SSL connection with openssl’s s_client. I recently had a similar problem and had it resolved. Here’s a link to that solution. It also includes information on how to use the s_client to test an SSL connection.

SSL Error: unable to get local issuer certificate

Community's user avatar

answered Jun 27, 2014 at 15:32

Jamie Counsell's user avatar

Jamie CounsellJamie Counsell

7,6096 gold badges45 silver badges81 bronze badges


Offline

Pavr

 


#1
Оставлено
:

16 июня 2012 г. 17:00:32(UTC)

Pavr

Статус: Участник

Группы: Участники

Зарегистрирован: 16.06.2012(UTC)
Сообщений: 14
Откуда: Moscow

Коллеги, помогите разобраться.
Есть веб-сервис, доступ к веб-серису осуществляется через прокси, который использует самоподписанный ГОСТ сертификат.
Что сделано:
1. Установил Крипто Про CSP.
2. При обращении к веб-сервису через браузер добавил в Windows сертификат в доверенные центры сертификации.
3. На .NET сделал клиента для веб-сервиса, все отлично работает.

НЕ получается сделать клиента для веб-сервиса на JAVA. java программы (soap UI, stylus studio) так же не могут вызвать веб-сервис.

Я подозреваю, что проблема в том, что java использует свое хранилище для доверенных сертификатов, а мой сертификат в него не добавлен.
Но добавить его туда НЕ получается.

Использую для импорта утилиту keytool IUI.

1. Сохранил сертификат из виндового хранилища в файл .crt.
2. При попытке добавить сертификат в хранилище c:Program Files (x86)Javajre6libsecuritycacerts сертификат не добавляется. При этом ошибок никаких не возникает.
3. При попытке открыть сертификат на просмотр в keytool IUI выдается ошибка

java.lang.ClassCastException: org.bouncycastle.crypto.params.ECPublicKeyParameters cannot be cast to org.bouncycastle.crypto.params.GOST3410PublicKeyParameters
at org.bouncycastle.crypto.signers.GOST3410Signer.init(Unknown Source)
at org.bouncycastle.jce.provider.JDKGOST3410Signer.engineInitVerify(Unknown Source)
at java.security.Signature.initVerify(Unknown Source)
at sun.security.x509.X509CertImpl.verify(Unknown Source)
at sun.security.x509.X509CertImpl.verify(Unknown Source)
at org.ragingcat.shared.util.jarsigner.UtilCrt.s_isSignedBy(UtilCrt.java:85)
at org.ragingcat.shared.util.jarsigner.UtilCrt.s_isSelfSigned(UtilCrt.java:65)
at org.ragingcat.kst.util.jarsigner.UtilKstAbs.s_getBoosSelfSigned(UtilKstAbs.java:1527)
at org.ragingcat.kst.util.jarsigner.UtilKstAbs._s_showKstOpen_(UtilKstAbs.java:2292)
at org.ragingcat.kst.util.jarsigner.UtilKstJks._s_showFile_(UtilKstJks.java:898)
at org.ragingcat.kst.util.jarsigner.UtilKstAll.s_showFile(UtilKstAll.java:217)
at org.ragingcat.kst.AppMainUIAbs.actionPerformed(AppMainUIAbs.java:95)
at org.ragingcat.kst.UIKeytool.actionPerformed(UIKeytool.java:932)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

1 ? ERROR (instance ID: 1)
. location: org.ragingcat.kst.UIKeytool.actionPerformed(evtAction)
. message: exc caught


Вверх


Offline

Евгений Афанасьев

 


#2
Оставлено
:

16 июня 2012 г. 17:59:54(UTC)

Евгений Афанасьев

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

Группы: Участники

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 656 раз в 619 постах

Здравствуйте.
Взаимодействие с сервисом должно осуществляться по защищенному каналу (TLS)?
Вы используете jtls?
Добавление в cacerts осуществляете утилитой keytool (встроенная утилита JRE)? Она должна сообщить об успешном добавлении либо вывести ошибку.
Keytool IUI использует библиотеки bouncycastle и может некорректно работать в данном случае.

Отредактировано пользователем 16 июня 2012 г. 18:04:46(UTC)
 | Причина: Не указана

Тех. поддержка
База знаний
Логирование JCP
Логирование JTLS
Тест JCP и сбор диаг. информации
Скачать JCP, JCSP и JTLS
Скачать Android CSP + SDK


Вверх


Offline

Pavr

 


#3
Оставлено
:

18 июня 2012 г. 19:11:39(UTC)

Pavr

Статус: Участник

Группы: Участники

Зарегистрирован: 16.06.2012(UTC)
Сообщений: 14
Откуда: Moscow

Да, взаимодействие должно осуществляться по защищенному каналу. Причем канал должен быть защищен по ГОСТу.
Вопрос. Если у меня установлен КриптоПРО CSP, мне для работы из Java с сервисом защищенным ГОСТ шифрованием нужно ставить КриптоПро JCP или Jtls?

Keytool не пробовал использовать. Попробую.


Вверх


Offline

Евгений Афанасьев

 


#4
Оставлено
:

18 июня 2012 г. 20:23:55(UTC)

Евгений Афанасьев

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

Группы: Участники

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 656 раз в 619 постах

Да, нужно установить jcp и jtls в используемую jre. С помощью jtls вы сможете создать защищеннное соединение.

Тех. поддержка
База знаний
Логирование JCP
Логирование JTLS
Тест JCP и сбор диаг. информации
Скачать JCP, JCSP и JTLS
Скачать Android CSP + SDK


Вверх


Offline

Pavr

 


#5
Оставлено
:

18 июня 2012 г. 20:23:58(UTC)

Pavr

Статус: Участник

Группы: Участники

Зарегистрирован: 16.06.2012(UTC)
Сообщений: 14
Откуда: Moscow

Попробовал добавить сертификат утилитой keytool. Перед этим установил КРИПТОПРо JCP.

команда такая.
C:Program FilesJavajre6bin>keytool -import -trustcacerts -file C:/temp/bank.cer -alias Bank -keystore $JAVA_HOME/jre/lib/security/cacerts

Ошибка — Ключ должен соответствовать алгоритму lde h 34.10-94.

18.06.2012 18:17:41 ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 1.0.53
18.06.2012 18:17:41 ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
18.06.2012 18:17:41 ru.CryptoPro.JCP.Sign.b engineInitVerify
WARNING: iЛ Ч ДОЛЖЕН СООТюЕТСТюОюАТд АЛГОРИТМУ lde h 34.10-94
java.security.InvalidKeyException: iЛ Ч ДОЛЖЕН СООТюЕТСТюОюАТд АЛГОРИТМУ lde h
34.10-94
at ru.CryptoPro.JCP.Sign.GostSign.a(Unknown Source)
at ru.CryptoPro.JCP.Sign.b.engineInitVerify(Unknown Source)
at java.security.Signature.initVerify(Unknown Source)
at sun.security.x509.X509CertImpl.verify(Unknown Source)
at sun.security.x509.X509CertImpl.verify(Unknown Source)
at sun.security.tools.KeyTool.addTrustedCert(Unknown Source)
at sun.security.tools.KeyTool.doCommands(Unknown Source)
at sun.security.tools.KeyTool.run(Unknown Source)
at sun.security.tools.KeyTool.main(Unknown Source)
keytool error: java.security.InvalidKeyException: iЛ Ч ДОЛЖЕН СООТюЕТСТюОюАТд АЛ
ГОРИТМУ lde h 34.10-94


Вверх


Offline

Евгений Афанасьев

 


#6
Оставлено
:

18 июня 2012 г. 20:48:39(UTC)

Евгений Афанасьев

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

Группы: Участники

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 656 раз в 619 постах

Вы не могли бы приложить сертификат?

Тех. поддержка
База знаний
Логирование JCP
Логирование JTLS
Тест JCP и сбор диаг. информации
Скачать JCP, JCSP и JTLS
Скачать Android CSP + SDK


Вверх


Offline

Pavr

 


#7
Оставлено
:

19 июня 2012 г. 12:01:38(UTC)

Pavr

Статус: Участник

Группы: Участники

Зарегистрирован: 16.06.2012(UTC)
Сообщений: 14
Откуда: Moscow

Да могу прислать сертификат. Еще такой вопрос. JCP и JTLS в демо режиме работают? JTLS у меня не ставится.

Из документации

Предварительно установить КриптоПро JCP (включая модули шифрования). Далее установку можно выполнить двумя путями:

1. Выполнить команду «<JRE>/bin/java -jar cpSSL.jar» и затем ввести серийный номер через контрольную панель

Ошибка
C:tempjcpjtls.1.0.53lib>java -jar cpSSL.jar
19.06.2012 9:43:14 ru.CryptoPro.ssl.ManifestInstall main
INFO: ManifestInstall start…
19.06.2012 9:43:14 ru.CryptoPro.ssl.ManifestInstall main
INFO: ManifestInstall url = file:/C:/temp/jcp/jtls.1.0.53/lib/cpSSL.jar
ShellInstaller makeAction start…
Exception in thread «main» ru.CryptoPro.Install.ExpectedArgumentException: lдна
из ояций:-install, -uninstall, -help, -installed не найдена.
at ru.CryptoPro.Install.GeneralConsoleSettings.a(Unknown Source)
at ru.CryptoPro.Install.GeneralConsoleSettings.<init>(Unknown Source)
at ru.CryptoPro.Install.ShellInstaller.makeAction(Unknown Source)
at ru.CryptoPro.ssl.ManifestInstall.main(Unknown Source)

2. Выполнить установку с вводом серийного номера
<JRE>/bin/java -cp cpSSL.jar ru.CryptoPro.ssl.JTLSInstall -install -verbose -sslserial XXXXX-XXXXX-XXXXX-XXXXX-XXXXX -sslcompany «My Company»

INFO: JTLSInstall checkInstallLicense isServer: true
ru.CryptoPro.Install.ArgumentException: Incorrect product type
at ru.CryptoPro.ssl.JTLSInstall.a(Unknown Source)
at ru.CryptoPro.ssl.JTLSInstall.parseArgs(Unknown Source)
at ru.CryptoPro.Install.GeneralConsoleSettings.parseArgs(Unknown Source)

at ru.CryptoPro.Install.ShellInstaller.makeAction(Unknown Source)
at ru.CryptoPro.Install.ShellInstaller.makeActionNoEx(Unknown Source)
at ru.CryptoPro.ssl.JTLSInstall.main(Unknown Source)
Caused by: ru.CryptoPro.JCP.tools.LicenseException: Incorrect product type
… 6 more
ShellInstaller makeActionNoEx end.


Вверх


Offline

Евгений Афанасьев

 


#8
Оставлено
:

19 июня 2012 г. 13:47:19(UTC)

Евгений Афанасьев

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

Группы: Участники

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 656 раз в 619 постах

Pavr написал:

Ошибка
C:tempjcpjtls.1.0.53lib>java -jar cpSSL.jar

Да, есть ошибка при установке без лицензии, в ближайшее время обновим архив.

Я посмотрел ваш сертификат, в нем указан алгоритм подписи: ГОСТ Р 34.11/34.10-94, а алгоритм откр. ключа: ГОСТ Р 34.10-2001. Попробуйте выпустить сертификат через консоль ControlPane.

При установке jtls с лицензией вы вводили свой номер лицензии?

Тех. поддержка
База знаний
Логирование JCP
Логирование JTLS
Тест JCP и сбор диаг. информации
Скачать JCP, JCSP и JTLS
Скачать Android CSP + SDK


Вверх


Offline

Ivanov-aa

 


#9
Оставлено
:

19 июня 2012 г. 14:08:58(UTC)

Ivanov-aa

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

Группы: Участники

Зарегистрирован: 01.08.2011(UTC)
Сообщений: 674
Откуда: Москва

Сказал(а) «Спасибо»: 9 раз
Поблагодарили: 38 раз в 36 постах

А вы пробовали запустить с опцией -install?

C:tempjcpjtls.1.0.53lib>java -jar cpSSL.jar -install


Вверх


Offline

Pavr

 


#10
Оставлено
:

19 июня 2012 г. 16:40:47(UTC)

Pavr

Статус: Участник

Группы: Участники

Зарегистрирован: 16.06.2012(UTC)
Сообщений: 14
Откуда: Moscow

Ivanov-aa написал:

А вы пробовали запустить с опцией -install?

C:tempjcpjtls.1.0.53lib>java -jar cpSSL.jar -install

Да, спасибо, так установилось.

afev написал:

Pavr написал:

Я посмотрел ваш сертификат, в нем указан алгоритм подписи: ГОСТ Р 34.11/34.10-94, а алгоритм откр. ключа: ГОСТ Р 34.10-2001. Попробуйте выпустить сертификат через консоль ControlPane.

Можно поподробнее по этому поводу? Что мне это даст?
Сервис с этим сертификатом дали мне как данность, мне нужно сделать клиента сервиса на JAVA.


Вверх

Пользователи, просматривающие эту тему

Guest

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

Афоризм

Хрен, положенный на мнение окружающих, обеспечивает спокойную и счастливую жизнь.

Фаина Раневская

Поддержка проекта

Если Вам сайт понравился и помог, то будем признательны за Ваш «посильный» вклад в его поддержку и развитие

 • Yandex.Деньги
  410013796724260

 • Webmoney
  R335386147728
  Z369087728698

Хранилище ключей и сертификатов

Защита данных в приложениях имеет важное значение, защита конфиденциальной информации —
первостепенное. Одним из самых распространённых способов защиты информации во все времена является
шифрование данных. Криптография, симметричное и асимметричное шифрование, ключи и сертификаты
непосредственно связаны с данной задачей. Используемые для защиты информации ключи и сертификаты
также нужно надежно защитить. Для этих целей используется keystore — хранилище
сертификатов и ключей.

keystore — это специализированное хранилище секретных данных, которое
используется Java-приложениями для шифрования, аутентификации и установки HTTPS соединений. Так, для
аутентификации клиента и сервера, устанавливающих SSL (Secure Sockets Layer — уровень защищённых cокетов)
соединение, требуются приватные ключи и сертификаты. Если используется односторонняя аутентификация, то
keystore используется только на серверной стороне. При двусторонней аутентификации клиент и
сервер обмениваются сертификатами; соответственно и у сервера, и у клиента должны быть keystore
с парой ключей private/public + сертификат. Иными словами keystore используется для хранения
ключей и сертификатов, применяемых для идентификации владельца ключа (клиента или сервера).

Java поддерживает несколько форматов хранилищ keystore :

• jks — стандартный тип хранилища в виде файла с расширением jks («java key storage»);
устанавливается по умолчанию и, поэтому, применяется наиболее часто.
• jceks — альтернативная реализация хранилища, которая использует более сильное шифрование на
основе triple DES; можно обновить имеющееся jks-хранилище до jceks соответствующей командой
утилиты keytool.
• pkcs12 — тип хранилища, предназначенный прежде всего для хранения или переноса закрытых
ключей пользователя, сертификатов и пр.

Каждая запись в keystore имеет уникальный псевдоним (alias). Рекомендуется в keystore не использовать
alias’ы, отличающиеся только регистром. В стандартной реализации каждый ключ в хранилище защищается
паролем; кроме того, всё хранилище целиком может быть защищено отдельным паролем.

Стандартное хранилище доверенных CA-сертификатов (Certificate Authority) для Java приложений располагается
в директории jre/lib/security/cacerts (пароль — changeit).

Информацию в хранилище можно разделить на две категории: ключевые записи (пары ключей private/public) и
доверенные сертификаты. Ключевая запись, используемая для криптографических целей, включает идентификационные
данные объекта и его закрытый ключ. Доверенный сертификат содержит идентификационные данные объекта и открытый
ключ. Запись с доверенным сертификатом не может использоваться в тех случаях, где требуется закрытый ключ.

Чтобы отделить ключевые записи от сертификатов целесообразно использовать различные хранилища : один для
собственных ключей, а другой — для доверенных сертификатов, включая сертификаты Центров сертификации (CA).
Такой подход позволит реализовать разделение между собственными сертификатами и соответствующими закрытыми ключами,
и доверенными сертификатами. Дополнительно можно обеспечить более высокую защиту для закрытых ключей в отдельном
keystore с ограниченным доступом, а доверенные сертификаты оставить в более свободном доступе.

В конце статьи представлен
Java пример просмотра содерживого хранилища ключей и сертификатов CertificateReader.

Утилита keytool

Для управления парами ключей (private/public), сертификатами и хранилищем keystore Java включает утилиту
keytool, располагаемую в директории bin. Для запуска keytool можно использовать командную строку.
Опции утилиты позволяют выполнять различные операции и получать определенные сведения. Так, чтобы получить
информацию об утилите, можно просто выполнить команду keytool без опций :

C:Program FilesJavajre1.8.0_121bin>keytool
Key and Certificate Management Tool

Commands:

-certreq          Generates a certificate request
-changealias      Changes an entry's alias
-delete           Deletes an entry
-exportcert       Exports certificate
-genkeypair       Generates a key pair
-genseckey        Generates a secret key
-gencert          Generates certificate from a certificate request
-importcert       Imports a certificate or a certificate chain
-importpass       Imports a password
-importkeystore   Imports one or all entries from another keystore
-keypasswd        Changes the key password of an entry
-list             Lists entries in a keystore
-printcert        Prints the content of a certificate
-printcertreq     Prints the content of a certificate request
-printcrl         Prints the content of a CRL file
-storepasswd      Changes the store password of a keystore

Use "keytool -command_name -help" for usage of command_name
 

Чтобы получить дополнительную справку о команде необходимо указать ее наименование и
волшебное слово help. Не забывайте о дефисе ‘-‘ перед опциями :

C:Program FilesJavajre1.8.0_121bin>keytool -certreq -help
keytool -certreq [OPTION]...

Generates a certificate request

Options:

-alias <alias>            alias name of the entry to process
-sigalg <sigalg>          signature algorithm name
-file <filename>          output file name
-keypass <arg>            key password
-keystore <keystore>      keystore name
-dname <dname>            distinguished name
-storepass <arg>          keystore password
-storetype <storetype>    keystore type
. . .
-providerarg <arg>        provider argument
-providerpath <pathlist>  provider classpath
-v                        verbose output
-protected                password through protected mechanism

Use "keytool -help" for all available commands
 

Создание самоподписанного сертификата

Для создания самоподписанного сертификата также необходимо использовать команду -genkey с указанием срока
действия сертификата в опции -validity. Следующая команда создаст пару 2048-битных RSA-ключей, действительных
на протяжении 365 дней, с указанным псевдонимом (parent) в заданном файле/хранилище ключей (keystore.jks).
Закрытый ключ в хранилище «закрывается» паролем, открытый ключ
«оборачивается» в самоподписанный сертификат
.

keytool -genkey -alias parent -keyalg RSA -validity 365 
        -keystore keystore.jks
 

Если заданного хранилища ключей (keystore.jks) не существует, то keytool создаст его. При выполнении команды
keytool будет запрашивать некоторые необходимые данные : пароль хранилища, Distinguished Name и пароль
закрытого ключа. Многие параметры используются со значениями по умолчанию. Так, например, алиас — mykey,
хранилище — .keystore в домашней директории пользователя (HOMEPATH), алгоритм шифрвания — SHA1withDSA и пр.

Distinquished Name

Сертификат создается в формате X.509. В этом формате в качестве идентификатора владельца используется
Distinquished Name или просто DN в формате X.500. Этот же формат идентификации объектов используется в
LDAP-протоколе или в SNMP. Distinquished Name задается в виде разделенных через запятую атрибутов :

  • CN — common name (имя владельца);
  • OU — organizational unit or department/division (департамент/отдел);
  • O — organization name (наименование организации);
  • L — locality or city (город/местоположение);
  • ST — state or province;
  • C — country, two chars (страна).

Часть из атрибутов могут быть пропущены; в этом случае им будет присвоено значение Unknown.

Одним из важных атрибутов сертификата являются альтернативные имена SAN (SubjectAlternativeName).
Подробности и пример внесения SAN в самоподписанный сертификат представлены на странице настройки
конфигурации сервера Tomcat.

Параметры сертификата можно указывать в качестве опции команды. Так, в следующем варианте примера задаётся
информация о компании, наименование алиаса, тип и размещение хранилища, срок действия, алгоритм для генерации
ключей, размер ключа, пароли на хранилище и на ключ.

C:Program FilesJavajdk1.8.0_121bin> 
  keytool -v -genkey -dname "CN=java-online.ru, 
   OU=Developers, O=IT Systems Inc., L=Moscow, C=RF" 
  -alias parent -storetype jks -keystore keystore.jks 
  -validity 365 -keyalg RSA -keysize 2048 
  -storepass mystorepass -keypass mykeypass

Generating 2 048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 365 days
        for: CN=java-online.ru, OU=Developers, O=IT Systems Inc., L=Moscow, C=RF
[Storing keystore.jks]
 

Новое хранилище было размещено в той же директории, где и располагается keytool.

Создание пары ключей

Для создания пары ключей необходимо использовать команду «-genkeypair». Следующая команда создаст пару
ключей «keypair» в хранилище keystore.jks, где размещен созданный ранее сертификат.

C:Program FilesJavajdk1.8.0_121bin> 
 keytool -alias keypair -genkeypair -keystore keystore.jks 
         -dname "CN=java-online.ru"

Enter keystore password:
Enter key password for <keypair>
        (RETURN if same as keystore password):
 

Сертификат и закрытый ключ сохранены в виде новой keystore записи, идентифицированной псевдонимом «keypair».
Открытый ключ обертывается в формат X.509 — это самоподписанный сертификат, который сохранен как
одноэлементная цепочка сертификата.

Опции команды genkeypair

  • {-v}
  • [-storepass storepass]
  • {-alias alias}
  • {-storetype storetype}
  • {-keystore keystore}
  • [-keypass keypass] — является паролем, используемым для защиты закрытого ключа
  • [-dname dname] — определяет отличительное имя в формате X.500, связанное с псевдонимом и используемое
    в качестве issuer и subject поля в самоподписанном сертификате
  • {-startdate value}
  • {-keyalg keyalg} — определяет алгоритм, который будет использоваться, чтобы генерировать пару ключей
  • {-keysize keysize} — определяет размер каждого ключа, который будет сгенерирован
  • {-sigalg sigalg} — определяет алгоритм, который должен использоваться, чтобы подписать самоподписанный
    сертификат; алгоритм должен быть совместимым с keyalg
  • {-ext ext}*
  • {-validity valDays}
  • {-providerClass provider_class_name {-providerArg provider_arg}}
  • {-protected}
  • {-Jjavaoption}

Создадим еще две пары ключей с псевдонимами «keypair1» и «keypair2», чтобы при просмотре содержимого хранилища
(ниже) был небольшой список пар ключей :

 keytool -alias keypair1 -genkeypair -keystore keystore.jks 
        -dname "CN=java-online.ru"
 keytool -alias keypair2 -genkeypair -keystore keystore.jks 
        -dname "CN=java-online.ru"
 

Экспорт сертификата

Сертификат можно экспортировать из хранилища и предоставить его пользователям Вашей «подписанной» программы.
Тогда пользователи могут занести Ваш сертификат в свое хранилище доверенных сертификатов. Для экспорта сертификата
используется команда «exportcert». Следующий пример извлекает из хранилища сертификат в файл «parent.cer» :

C:Program FilesJavajdk1.8.0_121bin> 
  keytool -exportcert -keystore keystore.jks 
  -alias parent -file parent.cer

Enter keystore password:
Certificate stored in file <parent.cer>
 

Импорт сертификата

Чтобы импортировать сертификат в хранилище, нужно его сначала получить каким-либо образом.
Не будем мудрить и извлечем сертификат с псевдонимом veriSignclass1g3ca из хранилища доверенных
сертификатов jrelibsecuritycacerts (пароль хранилища changeit). То есть выполним команду
экспорта сертификата с указанием соответствующего хранилища :

Экспорт сертификата из хранилища cacerts

C:Program FilesJavajdk1.8.0_121bin>
  keytool -exportcert -alias veriSignclass1g3ca -keystore 
  "C:Program FilesJavajdk1.7.0_67jrelibsecuritycacerts" 
  -file veriSignclass1g3ca.cer

Enter keystore password:
Certificate stored in file <veriSignclass1g3ca.cer>
 

Импорт сертификата в хранилище

Чтобы импортировать сертификат в хранилище keystore.jks необходимо использовать команду
«importcert». Если в качестве опции указать «-trustcacerts», то сертификат импортируется в хранилище
доверенных сертификатов, т.е. в jrelibsecuritycacerts. При выполнении команды импорта утилита
keytool попросит ввести пароль хранилища :

C:Program FilesJavajdk1.8.0_121bin> 
  keytool -importcert -keystore keystore.jks 
  -file veriSignclass1g3ca.cer

Enter keystore password: 
  Owner: 
   CN=VeriSign Class 1 Public Primary Certification Authority - G3, 
   OU="(c) 1999 VeriSign, Inc. - For authorized use only", 
   OU=VeriSign Trust Network, 
   O="VeriSign, Inc.", 
  C=USIssuer: 
   CN=VeriSign Class 1 Public Primary Certification Authority - G3, 
   OU="(c) 1999 VeriSign, Inc. - For authorized use only", 
   OU=VeriSign Trust Network, 
   O="VeriSign, Inc.", 
   C=US 
   Serial number: 8b5b75568454850b00cfaf3848ceb1a4 
Valid from: 
   Fri Oct 01 04:00:00 MSD 1999 until: Thu Jul 17 02:59:59 MSK 2036 
Certificate fingerprints: 
   MD5:  B1:47:BC:18:57:D1:18:A0:78:2D:EC:71:E8:2A:95:73 
   SHA1: 20:42:85:DC:F7:EB:76:41:95:57:8E:13:6B:D4:B7:D1:E9:8E:46:A5 
   SHA256: CB:B5:AF:18:5E:94:2A:24:02:F9:EA:CB:C0:ED:5B:B8:76:EE:A3: 
           C1:22:36:23:D0:04:47:E4:F3:BA:55:4B:65
   Signature algorithm name: SHA1withRSA Version: 1 
Trust this certificate? [no]:  y
Certificate was added to keystore
 

Просмотр хранилища

Для чтения содержимого хранилища необходимо использовать команду «-list». В качестве опции «-keystore» можно
указать путь к хранилищу. По умолчанию команда «-list» отображает цифровой отпечаток SHA1 сертификата. Следующий
код позволяет просмотреть содержимое созданного хранилища, включающего сертификат и три пары ключей :

C:Program FilesJavajdk1.8.0_121bin> 
   keytool -list -keystore keystore.jks
Enter keystore password:

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 5 entries

keypair2, 14.02.2018, PrivateKeyEntry,
Certificate fingerprint (SHA1): 
    C4:02:BA:D7:24:6B:84:2F:CD:F9:81:16:5F:74:E0:31:7B:C0:19:B1
keypair1, 14.02.2018, PrivateKeyEntry,
Certificate fingerprint (SHA1): 
    AB:BA:92:77:44:BD:B0:65:EB:29:0C:F9:86:64:0F:81:B7:4A:27:9A
keypair, 14.02.2018, PrivateKeyEntry,
Certificate fingerprint (SHA1): 
    8A:8B:21:83:1E:75:4F:C7:62:85:6A:31:84:45:AA:16:2B:20:06:1E
parent, 13.02.2018, PrivateKeyEntry,
Certificate fingerprint (SHA1): 
    DB:8B:9D:9D:DF:5B:B3:82:0E:19:C6:A4:A4:3E:08:C0:AB:20:F9:85
mykey, 18.02.2018, trustedCertEntry,
Certificate fingerprint (SHA1): 
    20:42:85:DC:F7:EB:76:41:95:57:8E:13:6B:D4:B7:D1:E9:8E:46:A5	
 

Опции команды list

  • {-v | -rfc}
  • [-storepass storepass]
  • {-alias alias}
  • {-storetype storetype}
  • {-keystore keystore}
  • {-providerName provider_name}
  • {-providerClass provider_class_name {-providerArg provider_arg}}
  • {-protected} {-Jjavaoption}

Если при просмотре хранилища использовать опцию «-v», то информация о сертификате выводится с дополнительной
информацией, включающей владельца, порядковый номер и т.д. При использовании опции «-rfc» содержание сертификата
печатается согласно интернет-стандарта RFC-1421.

На странице описания SSL сертификата представлен результат
выполнения команды просмотра хранилища keytool -list для опций ‘-v’ и ‘-rfc’.

Полную англоязычную версию документации на keytool можно найти
здесь.

Пример просмотра хранилища и сертификата

На скриншоте представлен пример CertificateReader, позволяющий просматривать хранилище ключей и
сертификаты, а также извлекать информацию о сертификате.

Внутри сертификата хранится пара значений Distinqueshed Names. Один DN принадлежит владельцу
сертификата, а второй DN указывает идентификатор цента сертификации (CA), подписавшего сертификат. В
случае с самоподписанным (self-signed) сертификатом, оба эти DN указывают на владельца сертификата.

Листинг примера

Интерфейс примера выполнен с использованием библиотеки Swing. Поскольку Swing не является предметом
данной статьи, то методы формирования интерфейса не представлены в листинге примера. При необходимости
желающие могут скачать исходный код примера в конце страницы.

В листинге примера представлены два метода : loadKeyStore, showCertificate. Первый метод позволяет выбрать
хранилище сертификатов. Второй метод выполняет чтение сертификата и представление его параметров в интерфейсе.
После листинга представлен скриншот, на котором выполнено чтение созданного сертификата.

import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;

public class CertificateReader extends JFrame 
{
    final String   TERMIN        = "Срок действия сертификата%s";
    final String   VALID         = "действителен"               ;
    final String   INVALID       = "не действителен"            ;
    final String   CREATER       = "Издатель%s"                 ;
    final String   NUMBER        = "Серийный номер%s"           ;
    final String   START         = "Начало срока действия%s"    ;
    final String   END           = "Конец срока действия%s"     ;
    final String   OWNER         = "Владелец%s"                 ;
    final String   ALGORITM      = "Алгоритм подписи%s"         ;
    final String   SIGN          = "Подпись сертификата%s"      ;
    final String   LF            = "n"                         ;
    final String   LF_SPACE      = " :n      "                 ;

    KeyStore       keyStore      = null; // хранилище
    JList<String>  lstAliases    = null;
    JTextField     txtFileName   = null;
    JTextArea      taCertificate = null;
    final  int     LIST_size     = 140 ;

    public CertificateReader()
    {
        setTitle("Просмотр хранилища сертификатов");
        setSize(600, 480);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(createCtrl(), BorderLayout.SOUTH);
        getContentPane().add(createGUI (), BorderLayout.CENTER);

        setVisible(true);
    }
    private JPanel createCtrl()
    {
        . . . 
    }
    private JSplitPane createGUI()
    {
        . . . 
    }
    void loadKeyStore() 
    {
        FileInputStream fis;
        // Выбор хранилища сертификатов
        JFileChooser chooser = new JFileChooser();
        if(chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
            txtFileName.setText(chooser.getSelectedFile().getAbsolutePath());
            try {
                // Чтение хранилище сертификатов
                keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
                fis      = new FileInputStream(txtFileName.getText());
                keyStore.load(fis, null);
                Enumeration<String> E = keyStore.aliases();

                // Формирование набор сертификатов
                Vector<String> certs = new Vector<String>();
                while (E.hasMoreElements())
                    certs.add(  (String)E.nextElement() );
                // Размещение сертификатов в компоненте
                lstAliases.setListData(certs);
                invalidate();
            }
            catch (Exception e) {
                JOptionPane.showMessageDialog(this ,
                    "Ошибка чтения хранилища сертификатов:n" + e);
            }
        }
    }

    void showCertificate(final String name)
    {
        Certificate cert = null;
        try {
            // Чтение сертификата
            cert = keyStore.getCertificate(name);
            X509Certificate xcert = (X509Certificate) cert;

        String valid = "";
            try {
                xcert.checkValidity();
                valid = VALID;
            } catch (Exception ex){
                valid = INVALID;
            }
            SimpleDateFormat sdf;
            sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
            String end   = sdf.format(xcert.getNotAfter ());
            String start = sdf.format(xcert.getNotBefore());
            String sign = new sun.misc.BASE64Encoder()
                                      .encode(cert.getSignature());

            String creater = xcert.getIssuerDN().getName();
            String owner   = xcert.getSubjectDN().getName();
            String number  = String.valueOf(xcert.getSerialNumber());
            String algo    = xcert.getSigAlgName();

            String info;
            info  = createLine(TERMIN  , valid  );
            info += createLine(CREATER , creater); 
            info += createLine(NUMBER  , number );
            info += createLine(START   , start  ); 
            info += createLine(END     , end    ); 
            info += createLine(OWNER   , owner  ); 
            info += createLine(ALGORITM, algo   ); 
            info += createLine(SIGN    , sign   ); 
            taCertificate.setText(info);
        } catch (KeyStoreException ex1) {
            JOptionPane.showMessageDialog(this  ,
                "Ошибка получения из хранилища сертификата с " +
                псевдонимом <<lstAliases.getSelectedValue()+">>");
        }
    }

    protected String createLine (String templ, String text)
    {
        return String.format(templ, LF_SPACE + text + LF);
    }

    public static void main(String[] args) {
        new CertificateReader();
    }
}

Примечание : класс CertificateReader используется в качестве примера на странице цифровой
подписи jar файлов

Скачать пример

Рассмотренный на странице пример просмотра хранилища ключей и сертификатов можно
скачать здесь (2.5 Кб).

Понравилась статья? Поделить с друзьями:
  • Ошибка при получении сервера df dferh 01 плей маркет
  • Ошибка при получении свойства сертификата указан неправильный алгоритм 0x80090008
  • Ошибка при получении лицензии папилон
  • Ошибка при получении лицензии на приложение 33 компас
  • Ошибка при получении криптографического контекста континент ап