Elettracompany.com

Компьютерный справочник
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java security cert

[Solved] java.security.cert.CertificateException: No subject alternative names present

This blog is about an LDAP SSL connectivity issue which comes after upgrading the Java version

The “java.security.cert.CertificateException: No subject alternative names present” exception is thrown when you are trying to make a secure connection over SSL and the hostname you are trying to connect is not valid when compared to the SSL certificate of the server.

When the server certificate is having Subject Alternative Names (SAN), the requesting home name must match with one of the SANs. If the server’s SSL certificate does not have SANs, then the requesting home name must match with the Common Name (CN) of the certificate.

Note: This blog is about a specific issue which is related to LDAP connectivity after upgrading the Java version. If your issue is not related to LDAP, please follow one of the links below to have a general idea on this error message.

Solve: «No subject alternative DNS name matching» error

I have been working on countless situations on solving SSL related issues, but today I have came across with a new one…

darray.wordpress.com

How to fix javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject…

In this article, we will focus on how to resolve the SSLHandshakeException and possible cause behind it. If you are…

www.littlebigextra.com

Question

Following error blocking up the startup of the WSO2 Identity Server after moving to Java version 1.8.0_181 from an older version.

Answer

The reason this error in java 1.8.0_181 is because this update includes security improvements for LDAP support. “Endpoint identification” has been enabled on LDAPS connections.

According to JDK 8u181 Update Release Notes, endpoint identification algorithms have been enabled by default to improve the robustness of LDAPS (secure LDAP over TLS) connections.

This update applies to all of the following Java versions and their future releases.

There may be situations where some applications that were previously able to successfully connect to an LDAPS server may no longer be able to do so. Such applications may, if they deem appropriate, disable endpoint identification using a new system property: com.sun.jndi.ldap.object.disableEndpointIdentification.

As a quick fix for this, we can disable endpoint identification by adding the following property after the line “$JAVA_OPTS ” in the /bin/wso2server.sh

But in a production environment, it’s not recommended to disable this feature. So, it’s better to solve by regenerating the LDAP server certificate with the certificate’s SAN or CN matching the hostname of LDAP server configured in primary or secondary userstores which a defined in following locations.

Hope this article would help you to add Subject Alternate Name (SAN) to a self-signed certificate.

For CA-signed certificates, we have to renew the existing certificate with SAN. To add SANs to a certificate, we can generate a Certificate Signing Request (CSR), submit to the Certification Authority and get the certificate renewed. This won’t generate new public/private keys, hence will not cause any issues in the existing deployment.

One other way to avoid this error is to use one of the hostnames which is valid under the LDAP server’s SSL certificate. If your Identity Server node is unable to resolve DNS for that particular domain name, you would add a mapping for that hostname with its IP in the “/etc/hosts” file.

Please leave a comment if you come across any issues or need any clarifications.

Инструкция по настройке сертификатов НУЦ в Java (Certificates)

Инструкция по настройке сертификатов НУЦ в Java (Certificates)

После установки программного обеспечения Java Runtime Environment 1.6 необходимо произвести настройку сертификатов выданных НУЦ следующим образам:

1. Открыть Панель управления (Пуск — Настройка — Панель управления) и запустить ярлык Java.

2. В открывшемся окне Java Control Panel перейти на вкладку Security и нажать на кнопку Certificates

3. В поле Certificate type из выпадающего списка выбрать значение Trusted Certificates

После выбора значения Trusted Certificates нажать на кнопку Import. Указать путь к корневому сертификату НУЦ на алгоритме RSA и нажать кнопку Open.

Импортированный сертификат появится в окне Certificates

Корневые сертификаты НУЦ можно скачать на сайте www. pki. в меню «Требования к ПК и к программному обеспечению» по пункту Сертификаты Национального удостоверяющего центра на алгоритмах ГОСТ и RSA;

4. Затем в этом же окне Certificates в поле Certificate type из выпадающего списка выбрать значение Client Authentication.

После выбора значения Client Authentication нажать на кнопку Import. Указать путь к клиентскому сертификату НУЦ на алгоритме RSA (полученный для сдачи отчетов) и нажать кнопку Open.

В окне запроса пароля на файл необходимо указать пароль, который выдан вместе с ЭЦП. После ввода пароля к ЭЦП нажать кнопку ОК.

В окне запроса пароля на хранилище необходимо указать пароль, который в дальнейшем будет использоваться (запрашиваться) при сдаче отчетности перед загрузкой Java апплета в браузере.

5. По завершению ведения пароля нажать на кнопку OK в окне Authentication Required, затем в окне Certificates нажать кнопку Close. Так же в окне Java Control Panel нажать кнопку OK.

6. Если выход в сети Internet осуществляется через прокси сервер на вкладке General в пункте Network Settings нажать кнопку «NETWORK SETTINGS…». В открывшемся окне Network Settings установить указать в поле «Direct connection» и нажать на кнопку ОК. Так же в окне Java Control Panel нажать кнопку OK.

Доверия не нашел для Android SSL-соединение

Я пытаюсь подключиться к коробке IIS6 под управлением GoDaddy 256bit SSL cert, и я получаю сообщение об ошибке:

пытался определить, что может быть причиной этого, но рисование пробелов прямо сейчас.

вот как я подключаю :

12 ответов:

решение @Chrispix опасно! доверие всем сертификатам позволяет кому-либо сделать человека в середине атаки! просто отправьте любой сертификат клиенту, и он его примет!

добавьте свой сертификат(ы) в пользовательский менеджер доверия, как описано в этом сообщении: доверяя всем сертификатам с помощью HttpClient через HTTPS

хотя это немного сложнее установить безопасное соединение с пользовательским сертификатом, это принесет вам разыскивается безопасность шифрования ssl без опасности человека в середине атаки!

вопреки принятому вами ответу не нужен пользовательский менеджер доверия, вам нужно исправить конфигурацию сервера!

я столкнулся с той же проблемой при подключении к серверу Apache с неправильно установленным сертификатом dynadot/alphassl. Я подключаюсь с помощью HttpsUrlConnection (Java / Android), который бросал —

фактическая проблема заключается в неправильной конфигурации сервера-проверьте его с помощью http://www.digicert.com/help/ или подобное, и он даже скажет вам решение:

«сертификат не подписан доверенным центром (проверка корневого хранилища Mozilla). Если вы купили сертификат у доверенного центра,вам, вероятно, просто нужно установить один или несколько промежуточных сертификатов. Обратитесь за помощью к поставщику сертификатов, чтобы сделать это для вашей серверной платформы.»

Читать еще:  Java tryparse int

вы также можете проверить сертификат с openssl:

openssl s_client -debug -connect www.thedomaintocheck.com:443

вы, вероятно, увидите:

Verify return code: 21 (unable to verify the first certificate)

и, ранее в выводе:

цепочка сертификатов будет содержать только 1 элемент (сертификат):

. но следует ссылаться на подписывающие органы в цепочке обратно на тот, которому доверяет Android (Verisign, GlobalSign и т. д.):

инструкции (и промежуточные сертификаты) для настройки вашего сервера обычно предоставляются центром, выдавшим Ваш сертификат, например: http://www.alphassl.com/support/install-root-certificate.html

после установки промежуточных сертификатов, предоставленных моим эмитентом сертификатов, теперь у меня нет ошибок при подключении с помощью HttpsUrlConnection.

вы можете доверять конкретному сертификату во время выполнения.
Просто загрузите его с сервера, поместите в активы и загрузите так, используя ssl-utils-android:

В приведенном выше примере я использовал OkHttpClient но SSLContext может использоваться с любым клиентом в Java.

Если у вас есть какие-либо вопросы, не стесняйтесь спрашивать. Я автор этой маленькой библиотеки.

обновление на основе последней документации Android (март 2017):

когда вы получаете ошибки такого типа:

проблема может быть одной из следующих:

  1. центр сертификации, выдавший сертификат сервера, был неизвестен
  2. сертификат сервера не был подписан CA, но был самоподписан
  3. в конфигурации сервера отсутствует промежуточный CA

решение состоит в том, чтобы научить HttpsURLConnection доверять определенному набору ЦС. Как? Пожалуйста, проверьте https://developer.android.com/training/articles/security-ssl.html#CommonProblems

другие, которые используют AsyncHTTPClient С com.loopj.android:android-async-http библиотека, пожалуйста, проверьте настройка AsyncHttpClient для использования HTTPS.

отвечая на очень старый пост. Но, возможно, это поможет какому-то новичку, и если не из вышеперечисленного получится.

объяснение: я знаю, что никто не хочет объяснения дерьма; скорее решение. Но в одном лайнере вы пытаетесь получить доступ к службе с вашего локального компьютера на удаленный компьютер, который не доверяет вашей машине. Вы запрашиваете необходимость получить доверие от удаленного сервера.

устранение: следующее решение предполагает, что у вас есть выполнены следующие условия

  1. попытка доступа к удаленному api с вашего локального компьютера.
  2. вы строите для Android-приложение
  3. ваш удаленный сервер находится под фильтрацией прокси (вы используете прокси в настройках браузера для доступа к удаленной службе api, как правило, промежуточный или dev-сервер)
  4. вы тестируете на реальном устройстве

действия:

вам нужен .файл расширения хранилища ключей в зарегистрируйтесь в своем приложении. Если вы не знаете как создать .файл хранилища ключей; а затем переходите к следующей создать .keystore file или иначе перейти к следующему разделу Подписать Apk Файл

создать .keystore file

Откройте Android Studio. Нажмите в верхнем меню построить > создать подписанный APK. В следующем окне нажмите кнопку создать новый. В новом окне введите данные во все поля. Помню два поля пароля, которые я рекомендую, должны иметь один и тот же пароль; не используйте другой пароль; а также помните путь сохранения в самом верхнем поле путь к хранилищу ключей:. После ввода всего поля нажмите кнопку ОК.

Подписать Apk Файл

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

  1. построить > чистый проект, подождите, пока он не закончит очистку
  2. построить > Создать подписанный APK
  3. клик
  4. выбрать .keystore файл, который мы только что создали в создать .keystore file раздел
  5. введите тот же пароль, который вы создали при создании в создать .keystore file. Используйте тот же пароль для Key store password и Key password поля. Также введите псевдоним
  6. нажать кнопку
  7. в следующий экран, который может отличаться в зависимости от настроек в build.gradle файлы, вам нужно выбрать Build Types и Flavors .
  8. на Build Types выбрать release из выпадающего

на Flavors однако это будет зависеть от ваших настроек в . Выбирай staging из этой области. Я использовал следующие настройки в build.gradle , вы можете использовать то же самое, что и мой, но убедитесь, что вы измените applicationId к вашему имени пакета

нажмите на два нижних Signature Versions установите флажки и нажмите .

Почти Нет:

вся тяжелая работа сделана, теперь движение истины. Чтобы получить доступ к резервному копированию промежуточного сервера через прокси, вам нужно сделать некоторые настройки в ваших реальных тестовых устройствах Android.

Настройка прокси в устройстве Android:

  1. нажмите на настройку внутри телефона Android, а затем wi-fi
  2. долгое нажатие на подключенный wifi и выберите Modify network
  3. выберите Advanced options если вы не видите Proxy Hostname поле
  4. на Proxy Hostname введите IP-адрес или имя хоста, к которому вы хотите подключиться. Типичный промежуточный сервер будет называться stg.api.mygoodcompany.com
  5. для порта введите четырехзначный номер порта, например 9502
  6. ударил

Последняя Остановка:

помните, что мы создали подписанный файл apk в подписать APK файл. Теперь настало время установить этот файл APK.

  1. откройте терминал и перейдите в папку подписанного файла apk
  2. подключите устройство Android к вашей машине
  3. удалите все предыдущие установленные apk-файлы с устройства Android
  4. выполнить adb install name of the apk file
  5. если по какой-то причине вышеприведенная команда возвращается с adb command not found . Введите полный путь как C:UsersshahAppDataLocalAndroidsdkplatform-toolsadb.exe install name of the apk file

надеюсь, что проблема может быть решена. Если нет, пожалуйста, оставьте мне комментарии.

сообщение об ошибке, которое я получал, было похоже, но причина заключалась в том, что самозаверяющий сертификат истек. Когда клиент openssl был предпринят, он дал мне причину, которая была упущена, когда я проверял диалоговое окно сертификата из firefox.

Итак, в общем случае, если сертификат находится в хранилище ключей и его «действительный», эта ошибка исчезнет.

У меня была такая же проблема при подключении с Android-клиента на сервер Kurento. Kurento использовать сертификаты сервера следующих, так что мне пришлось конвертировать Пэм к нему. В качестве входных данных для преобразования я использовал сертификат.PEM файл и это приводит к таким ошибкам. Но если использовать fullchain.Пем вместо верняк.Пем — все в порядке.

У меня была такая же проблема, что я нашел, что сертификат .crt файл я предоставил отсутствует промежуточный сертификат. Поэтому я спросил всех .crt файлы от моего администратора сервера, а затем объединил их в обратном порядке.

Ex. 1. Корень.ЭЛТ 2. Между.ЭЛТ 3. myCrt.ЭЛТ

в windows я выполнил копия Интер.ЭЛТ + корень.ЭЛТ newCertificate.ЭЛТ

(здесь я проигнорировал myCrt.crt)

тогда я предоставил newCertificate.crt-файл в код через входной поток. Работа сделанный.

в пряничных телефонах я всегда получаю эту ошибку: Trust Anchor not found for Android SSL Connection , даже если я настроил полагаться на мой сертификат.

вот код, который я использую (на языке Scala):

В основном, я настраиваю доверие к своему пользовательскому сертификату. Если это не удается, то я отключаю безопасность. Это не лучший вариант, но единственный выбор, который я знаю со старыми и глючными телефонами.

этот пример кода, может быть легко переведен в Java.

в моем случае это происходило после обновления до Android 8.0. Самозаверяющий сертификат Android был настроен на доверие, используя алгоритм подписи SHA1withRSA. Переход на новый сертификат, используя алгоритм подписи SHA256withRSA, исправил проблему.

ошибка привязки доверия может произойти по многим причинам. Для меня это было просто, что я пытался получить доступ к https://example.com/ вместо https://www.example.com/ .

поэтому вы можете дважды проверить свои URL-адреса, прежде чем начать создавать свой собственный менеджер доверия (как я сделал).

Как исправить » java.безопасность.сертификат.CertificateException: нет альтернативных имен субъектов » ошибка?

у меня есть клиент веб-службы Java, который использует веб-службу через HTTPS.

когда я подключаюсь к URL-адресу службы ( https://AAA.BBB.CCC.DDD:9443/ISomeService ), Я получаю исключение java.security.cert.CertificateException: No subject alternative names present .

чтобы исправить это, я сначала побежал openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txt и получил следующее содержание в файле certs.txt :

АФАИК, теперь мне нужно

  1. извлечь часть certs.txt между ——BEGIN CERTIFICATE—— и ——END CERTIFICATE—— ,
  2. измените его так, чтобы имя сертификата было равно AAA.BBB.CCC.DDD и
  3. затем импортируйте результат с помощью keytool -importcert -file fileWithModifiedCertificate (где fileWithModifiedCertificate в результате операций 1 и 2).

если да, то как именно я могу заставить сертификат с шага 1 Работать с IP-адресом ( AAA.BBB.CCC.DDD )?

обновление 1 (23.10.2013 15: 37 MSK): в ответ аналогичный вопрос я прочитал следующее:

если вы не контролируете это сервер, используйте его имя хоста (при условии что существует по крайней мере CN, соответствующий этому имени хоста в существующем сертификат.)

что именно означает» использовать»?

9 ответов:

я исправил проблему, отключив проверки HTTPS, используя представленный подход здесь:

Я поставил следующий код в тег ISomeService класс:

Так как я использую https://AAA.BBB.CCC.DDD:9443/ISomeService только для целей тестирования, это достаточно хорошее решение.

У меня та же проблема и решена с помощью этого кода. Я поставил этот код перед первым вызовом на мои веб-сервисы.

это просто и работает нормально.

здесь является исходным источником.

проверка удостоверения сертификата выполняется в соответствии с запросами клиента.

когда ваш клиент использует https://xxx.xxx.xxx.xxx/something (где xxx.xxx.xxx.xxx — это IP-адрес), Идентификатор сертификата проверяется по этому IP-адресу (теоретически, только с использованием расширения IP SAN).

если Ваш сертификат не имеет IP SAN, но DNS SANs (или если нет DNS SAN, общее имя в теме DN), вы можете заставить это работать, заставив вашего клиента использовать URL с этим именем хоста вместо этого (или a имя хоста, для которого сертификат будет действителен, если существует несколько возможных значений). Например, если у сертификата есть имя www.example.com используйте https://www.example.com/something .

конечно, вам понадобится это имя хоста для разрешения на этот IP-адрес.

кроме того, если есть какие-либо DNS SANs, CN в DN субъекта будет проигнорирован, поэтому используйте имя, которое соответствует одному из DNS SANs в этом случае.

чтобы импортировать сертификат:

  1. извлечь сертификат с сервера, например, openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txt Это будет извлекать сертификаты в формате PEM.
  2. преобразуйте сертификат в формат DER, так как это то, что ожидает keytool, например openssl x509 -in certs.txt -out certs.der -outform DER
  3. теперь вы хотите импортировать этот сертификат в системный файл ‘cacert’ по умолчанию. Найдите системный файл по умолчанию ‘cacerts’ для вашей установки Java. Взгляните на как получить расположение cacerts java по умолчанию установка?
  4. импорт сертификатов в этот файл cacerts: sudo keytool -importcert -file certs.der -keystore

пароль cacerts по умолчанию — «changeit».

Если сертификат выдается для полного доменного имени, и вы пытаетесь подключиться по IP-адресу в своем коде Java, то это, вероятно, должно быть исправлено в вашем коде, а не возиться с самим сертификатом. Измените код для подключения по полному доменному имени. Если полное доменное имя не может быть разрешено на компьютере разработчика, просто добавьте его в файл hosts или настройте компьютер с помощью DNS сервер, который может разрешить это полное доменное имя.

моя проблема с получением этой ошибки была решена с помощью полного URL «qatest.ourCompany.com/webService» вместо того, чтобы просто «qatest / webService». Причина заключалась в том, что наш сертификат безопасности имел подстановочный знак, т. е. «*.ourCompany.com как только я ввел полный адрес, исключение исчезло. Надеюсь, это поможет.

вы не можете отключить всю проверку ssl, и поэтому вы можете просто отключить проверку имени хоста через это, что немного менее страшно, чем альтернатива:

Как упоминалось conapart3 SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER теперь устарел, поэтому он может быть удален в более поздней версии, поэтому вы можете быть вынуждены в будущем свернуть свой собственный, хотя я бы все равно сказал, что буду держаться подальше от любых решений, где вся проверка отключена.

я исправил эту проблему правильным образом, добавив имена alt субъекта в сертификат, а не внося какие-либо изменения в код или отключая SSL, в отличие от того, что предлагают здесь другие ответы. Если вы ясно видите, что исключение говорит ,что «Suject alt names отсутствуют», поэтому правильный способ должен добавить их

вышеуказанная ошибка означает, что в вашем файле JKS отсутствует необходимый домен, на котором вы находитесь попытка получить доступ к приложению.Вам нужно будет использовать Open SSL и ключевой инструмент для добавления нескольких доменов

  1. скопируйте openssl.cnf в текущий каталог
  2. echo ‘[ subject_alt_name ]’ >> openssl.cnf
  3. echo ‘subjectAltName = DNS:example.mydomain1.com, DNS:example.mydomain2.com, DNS:example.mydomain3.com, 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/CN=www.example.com/[email protected]’ -days 365

экспорт открытого ключа (.PEM) файл в формате PKS12. Это предложит вам ввести пароль

создать.JKS из самозаверяющего PEM (Хранилище ключей)

создайте сертификат из хранилища ключей или JKS-файла

, поскольку вышеуказанный сертификат является самоподписанным и не подтверждена центром сертификации, он должен быть добавлен в хранилище доверенных сертификатов(cacerts файл в ниже для Mac, для Windows, узнайте, где установлен JDK является.)

оригинальный ответ написал по этой ссылке здесь.

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

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

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

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

Каждая запись в 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 без опций :

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

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

Для создания самоподписанного сертификата также необходимо использовать команду -genkey с указанием срока действия сертификата в опции -validity. Следующая команда создаст пару 2048-битных RSA-ключей, действительных на протяжении 365 дней, с указанным псевдонимом (parent) в заданном файле/хранилище ключей (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.

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

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

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

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

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

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

  • [-storepass storepass]
  • [-keypass keypass] — является паролем, используемым для защиты закрытого ключа
  • [-dname dname] — определяет отличительное имя в формате X.500, связанное с псевдонимом и используемое в качестве issuer и subject поля в самоподписанном сертификате
  • <-keyalg keyalg>— определяет алгоритм, который будет использоваться, чтобы генерировать пару ключей
  • <-keysize keysize>— определяет размер каждого ключа, который будет сгенерирован
  • <-sigalg sigalg>— определяет алгоритм, который должен использоваться, чтобы подписать самоподписанный сертификат; алгоритм должен быть совместимым с keyalg
  • <-ext ext>*
  • <-providerClass provider_class_name <-providerArg provider_arg>>

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

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

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

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

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

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

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

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

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

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

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

  • [-storepass storepass]
  • <-providerClass provider_class_name <-providerArg provider_arg>>

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

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

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

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

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

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

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

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

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

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

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

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

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector
×
×