IT и мир ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд

Java security cert certificateexception X.509 not found #78


Copy link Quote reply

kaanusha commented Jan 17, 2017

String passKey = «C:Certificate_1.p12»;
String password = «1222»;
String appleFile = «C:AppleWorldwideDeveloperRelationsCertificationAuthority.pem»;

PKSigningInformationUtil().loadSigningInformationFromPKCS12AndIntermediateCertificate(passKey, password, appleFile); is throwing X.509 not found .

could you please help me in resolving this.

This comment has been minimized.

Copy link Quote reply

drallgood commented Jan 17, 2017

Sorry, but I’m really not sure I can help you much there.

First of all, I need the full stack face to know which file this is happening for. Second, you should check, that your PKCS12 file actually contains a certificate. You can do this for example using the openssl command line tool. No idea how that works on Windows, though.

This comment has been minimized.

Copy link Quote reply

kaanusha commented Jan 18, 2017

Thank you for the fast response.
I am using one of the methods provided by JPasskit Framework classes for signing the certificates.

As i mentioned in earlier post, i am just passing the certificates — .p12, .pem paths and the password to the Jpasskit method.

Below are the code snippets of the methods and their inner methods .

Jpasskit method , I am calling from my code is:
public PKSigningInformation loadSigningInformationFromPKCS12AndIntermediateCertificate(final String pkcs12KeyStoreFilePath,
final String keyStorePassword, final String appleWWDRCAFilePath) throws IOException, NoSuchAlgorithmException, CertificateException,
KeyStoreException, NoSuchProviderException, UnrecoverableKeyException <

And below are the two internal methods, i am not getting even , which method is throwing this exception.

public KeyStore loadPKCS12File(final String pathToP12, final String password) throws KeyStoreException, NoSuchAlgorithmException,
CertificateException, IOException <
KeyStore keystore = KeyStore.getInstance(«PKCS12»);

loadDERCertificate method:
public X509Certificate loadDERCertificate(final String filePath) throws IOException, CertificateException <
FileInputStream certificateFileInputStream = null;
try <
File certFile = new File(filePath);
if (!certFile.exists()) <
// try loading it from the classpath
URL localCertFile = PKFileBasedSigningUtil.class.getClassLoader().getResource(filePath);
if (localCertFile == null) <
throw new FileNotFoundException(«File at » + filePath + » not found»);
certFile = new File(localCertFile.getFile());
certificateFileInputStream = new FileInputStream(certFile);

Do we have any specifications that this kind of code will work(development/execution) only on particular OS?

How to fix the “ No subject alternative names present” error?

I have a Java web service client, which consumes a web service via HTTPS.

When I connect to the service URL ( https://AAA.BBB.CCC.DDD:9443/ISomeService ), I get the exception No subject alternative names present .

To fix it, I first ran openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txt and got following content in file certs.txt :

AFAIK, now I need to

  1. extract the part of certs.txt between ——BEGIN CERTIFICATE—— and ——END CERTIFICATE—— ,
  2. modify it so that the certificate name is equal to AAA.BBB.CCC.DDD and
  3. then import the result using keytool -importcert -file fileWithModifiedCertificate (where fileWithModifiedCertificate is the result of operations 1 and 2).

Is this correct?

If so, how exactly can I make the certificate from step 1 work with IP-based adddress ( AAA.BBB.CCC.DDD ) ?

Update 1 (23.10.2013 15:37 MSK): In an answer to a similar question, I read the following:

If you’re not in control of that server, use its host name (provided that there is at least a CN matching that host name in the existing cert).

What exactly does «use» mean?

Читать еще:  Произошел крах плагина java

17 Answers 17

I fixed the problem by disabling HTTPS checks using the approach presented here:

I put following code into the the ISomeService class:

Since I’m using the https://AAA.BBB.CCC.DDD:9443/ISomeService for testing purposes only, it’s a good enough solution.

I’ve the same problem and solved with this code. I put this code before the first call to my webservices.

It’s simple and works fine.

Here is the original source.

The verification of the certificate identity is performed against what the client requests.

When your client uses (where is an IP address), the certificate identity is checked against this IP address (in theory, only using an IP SAN extension).

If your certificate has no IP SAN, but DNS SANs (or if no DNS SAN, a Common Name in the Subject DN), you can get this to work by making your client use a URL with that host name instead (or a host name for which the cert would be valid, if there are multiple possible values). For example, if you cert has a name for , use .

Of course, you’ll need that host name to resolve to that IP address.

In addition, if there are any DNS SANs, the CN in the Subject DN will be ignored, so use a name that matches one of the DNS SANs in this case.

This is an old question, yet I had the same problem when moving from JDK 1.8.0_144 to jdk 1.8.0_191

We found a hint in the changelog:

we added the following additional system property, which helped in our case to solve this issue:

To import the cert:

  1. Extract the cert from the server, e.g. openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txt This will extract certs in PEM format.
  2. Convert the cert into DER format as this is what keytool expects, e.g. openssl x509 -in certs.txt -out certs.der -outform DER
  3. Now you want to import this cert into the system default ‘cacert’ file. Locate the system default ‘cacerts’ file for your Java installation. Take a look at How to obtain the location of cacerts of the default java installation?
  4. Import the certs into that cacerts file: sudo keytool -importcert -file certs.der -keystore

Default cacerts password is ‘changeit’.

If the cert is issued for an FQDN and you’re trying to connect by IP address in your Java code, then this should probably be fixed in your code rather than messing with certificate itself. Change your code to connect by FQDN. If FQDN is not resolvable on your dev machine, simply add it to your hosts file, or configure your machine with DNS server that can resolve this FQDN.

I fixed this issue in a right way by adding the subject alt names in certificate rather than making any changes in code or disabling SSL unlike what other answers suggest here. If you see clearly the exception says the «Subject alt names are missing» so the right way should be to add them

The above error means that your JKS file is missing the required domain on which you are trying to access the application.You will need to Use Open SSL and the key tool to add multiple domains

  1. Copy the openssl.cnf into a current directory
  2. echo ‘[ subject_alt_name ]’ >> openssl.cnf
  3. echo ‘subjectAltName =,,, DNS: localhost’>> openssl.cnf
  4. openssl req -x509 -nodes -newkey rsa:2048 -config openssl.cnf -extensions subject_alt_name -keyout private.key -out self-signed.pem -subj ‘/C=gb/ST=edinburgh/L=edinburgh/O=mygroup/OU=servicing/’ -days 365

Export the public key (.pem) file to PKS12 format. This will prompt you for password

Create a.JKS from self-signed PEM (Keystore)

Generate a Certificate from above Keystore or JKS file

Since the above certificate is Self Signed and is not validated by CA, it needs to be added in Truststore(Cacerts file in below location for MAC, for Windows, find out where your JDK is installed.)

Криптография в Java. Класс Certificate

Привет, Хабр! Представляю вашему вниманию перевод заключительной статьи «Java Certificate» автора Jakob Jenkov из серии статей для начинающих, желающих освоить основы криптографии в Java.


Java Certificate (Сертификат)

Класс сертификата ( представляет собой сертификат удостоверяющий принадлежность некоторому субъекту, например, пользователю. Экземпляр класса сертификата содержит имя и другие сведения об объекте, который он идентифицирует, а также, возможно, цифровую подпись от центра сертификации (ЦС). Класс Certificate является абстрактным классом, поэтому, вы можете использовать в качестве типа переменной Certificate , а ваша переменная всегда будет указывать на подкласс. Этот класс имеет один подкласс — X509Certificate , который представляет сертификат X.509, использующийся в качестве сертификата в протоколах HTTPS и TLS.

Получение экземпляра сертификата

Вы можете получить экземпляр сертификата следующими способами:

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


Метод getEncoded() сертификата возвращает закодированную версию сертификата в виде байтового массива. Например, если сертификат является сертификатом X509, возвращенный байтовый массив будет содержать версию экземпляра сертификата в кодировке X.590 (ASN.1 DER). Вот пример использования метода getEncoded() :


Метод сертификата getPublicKey() возвращает открытый ключ этого экземпляра сертификата. Вот пример метода getPublicKey() :


Метод getType() возвращает тип экземпляра сертификата. Пример getType() :


Класс сертификата содержит три метода verify() . Эти методы могут использоваться для проверки того, что сертификат действительно подписан с закрытым ключом, соответствующим ожидаемому открытому ключу. Вот пример проверки сертификата:

Метод verify() не возвращает значения. Если проверка не пройдена, будет выдано исключение InvalidKeyException . Если не сгенерировано исключение, экземпляр сертификата можно считать проверенным.

Java CertificateFactory (Фабрика сертификатов

Класс CertificateFactory ( способен создавать экземпляры сертификата ( Certificate ) из двоичных данных сертификатов с кодировками X.509 (ASN.1 DER). CertificateFactory также может создавать экземпляры CertPath . CertPath — это цепочка сертификатов, где каждый сертификат подписан следующим сертификатом в данной цепочке.

Создание экземпляра CertificateFactory

Прежде чем вы сможете создавать экземпляры Certificate , вы должны создать экземпляр CertificateFactory . Пример:

В этом примере создается экземпляр CertificateFactory , способный создавать экземпляры сертификата X.509 ( X509Certificate — подкласс Certificate ).

Создание экземпляра Certificate

Создав экземпляр CertificateFactory , вы можете начать создавать экземпляры Certificate . Это делается с помощью вызова метода generateCertificate() . Пример вызова метода generateCertificate() :

Создание экземпляра CertPath

CertificateFactory также может создавать экземпляр CertPath . Экземпляр CertPath создается вызовом метода generateCertPath() :

Java CertPath (Цепочка сертификатов)

Класс CertPath ( представляет цепочку сертификатов (объекты Certificate ), где каждый сертификат является цифровым подписывающим лицом следующего сертификата в цепочке. Класс CertPath обычно используется для проверки сертификата личности вместе с сертификатами центров сертификации (ЦС), которые подписали сертификат.

Получение экземпляра CertPath

Обычно экземпляр CertPath получают из фабрики сертификатов ( CertificateFactory или CertPathBuilder ).


Получив экземпляр CertPath , вы можете получить экземпляры Certificate , из которых состоит CertPath , вызвав метод getCertificates() . Вот пример получения сертификатов из экземпляра CertPath :


Метод getType() возвращает строку, указывающую, какой тип сертификатов (например, X.509) содержится в этом экземпляре CertPath . Вот пример получения типа CertPath через методом getType() :

Редакторский дайджест

Присылаем лучшие статьи раз в месяц

Скоро на этот адрес придет письмо. Подтвердите подписку, если всё в силе.

  • Скопировать ссылку
  • Facebook
  • Twitter
  • ВКонтакте
  • Telegram
  • Pocket

Похожие публикации

  • 22 марта 2019 в 12:31

Криптография в Java. Класс Cipher

Криптография в Java



AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Комментарии 9

… представляет собой сертификат удостоверяющий принадлежность некоторому субъекту, например, пользователю.

Принадлежность приватного ключа, публичная часть которого в сертификате

А я разве сказал, что в сертификате закрытый ключ? В сертификате находится открытый ключ, из какого-то источника вы знаете, что он принадлежит Пете. Так как открытому ключу соответствует закрытый, то, подтвердив, что ключ действительно Петин, вы также транзитивно подтверждаете, что приватный ключ из пары открытый-закрытый ключ принадлежит Пете. А значит, шифруя открытым ключом сообщение или проверяя им подпись, вы можете быть уверены, что прочитает его/сгенерировал ее именно Петя, а ни кто иной.

Который является частью… ну да, сертификата.
Странно получается. По сути, файл с расширением «cer» — это публичный ключ. Этот ключ дополнен подписью удостоверяющего центра, которая подтверждает, что бинарные данные ключа соответствуют описательным полям (субъект, мэйл, то-сё). Но самая мякотка, суть и смысл существования этого файла — всё же ключ. Всё остальное, в том числе подпись УЦ — это дополнительные данные разной степени полезности.

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

Когда генерится ключевая пара, мы имеем два ключа — секретный и публичный. Публичный мы можем снабдить сертификатом соответствия. А можем и не снабжать. Можем снабдить, но оформить отдельным файликом. Почему бы и нет? Заливка ключа и сертификата к нему в один файл — это всего лишь один из возможных вариантов. В том же Биткоине, например, асимметричная криптография используется вовсю, но никаких сертификаций там отродясь нет.

Ссылка на основную публикацию