Как запустить keytool linux

Обновлено: 04.07.2024

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

Оглавление:

Утилита Keytool

Java Keytool — это инструмент командной строки, который может генерировать пары открытый ключ / закрытый ключ и сохранять их в хранилище ключей. Исполняемый файл утилиты распространяется вместе с Java SDK (или JRE), поэтому, если у вас установлен SDK, значит она у вас также будет предустановлена.
Исполняемый файл называется keytool . Чтобы выполнить его, откройте командную строку (cmd, console, shell и т.д.). и измените текущий каталог на каталог bin в каталоге установки Java SDK. Введите keytool , а затем нажмите клавишу Enter . Вы должны увидеть что-то похожее на это:

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

Скрипты Keytool

Команды утилиты Keytool принимают много аргументов, правильность установки которых может быть трудно запомнить. Поэтому рекомендуется создать несколько скриптов CMD или Shell с последовательностью команд Keytool . Эти сценарии упрощают повторное выполнение команд, а также позволяют вернуться назад и посмотреть, как было создано хранилище ключей.

Генерация ключевой пары

Генерация ключевой пары (открытый ключ / закрытый ключ) является одной из наиболее распространенных задач, для которых используется утилита Keytool . Сгенерированная пара ключей вставляется в файл KeyStore как пара ключей с собственной подписью. Вот общий формат командной строки для генерации пары ключей:

Аргументы объяснены в разделе Аргументы Keytool. Не все эти аргументы нужны и многие являются не обязательными. Утилита сообщит вам, если вы пропустили обязательный аргумент. Вот пример команды, которая импортирует сертификат в KeyStore. Не забудьте удалить разрывы строк при вводе команды в командной строке.

Список записей хранилища

Чтобы вывести список записей в хранилище ключей, вы можете использовать команду list . Ниже представлен формат для команды list . Разрывы строк предназначены только для упрощения чтения. Удалите разрывы строк перед выполнением команды:

Вот пример команды list . Не забудьте удалить разрывы строк!

Эта команда выведет список всех записей в данном хранилище ключей. Результат выполнения будет выглядеть примерно так:

Если вы включите аргумент alias в команду list , в список попадет только запись, соответствующая данному псевдониму. Вот пример команды list с аргументом alias :

Результат выполнения вышеупомянутой команды:

Удаление записи хранилища ключей

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

Вот пример вызова команды delete . Не забудьте удалить разрывы строк перед запуском!

Эта команда удаляет запись хранилища с псевдонимом testkey хранящегося в файле keystore.jks .

Генерация запроса на сертификат

Утилита keytool может генерировать запрос сертификата с помощью команды certreq . Запрос сертификата — это запрос к центру сертификации (ЦС) на создание публичного сертификата для вашей организации. После создания запроса на сертификат он должен быть отправлен в центр сертификации, в котором вы хотите создать сертификат (например, Verisign, Thawte или какой-либо другой центр сертификации). Прежде чем вы сможете сгенерировать запрос сертификата для личного ключа и пары открытых ключей, вы должны сгенерировать этот закрытый ключ и пару открытых ключей в хранилище ключей (или импортировать его). Как это сделать можно посмотреть в соответсвтующей главе. Вот формат команды для генерации запроса сертификата. Не забудьте удалить все разрывы строк при использовании этой команды:

Вот пример команды -certreq :

Эта команда сгенерирует запрос сертификата для ключа, сохраненного с псевдонимом testkey в файле keystore.jks , и запишет запрос сертификата в файл с именем certreq.certreq .

Аргументы утилиты keytool

Ниже приведен список аргументов, которые принимают различные команды keytool . Помните, что не все команды принимают все эти аргументы. Посмотрите на конкретную команду, чтобы увидеть, какие аргументы она принимает.

Что такое Keytool ?

Keytool - это утилита командной строки, для управления ключами или сертификатами, а так же хранилищами ключей. Она позволяет пользователям управлять своими собственными парами открытых и закрытых ключей и связанными сертификатами для использования при аутентификации, где от пользователя, это требует конечный сервис или службах целостности данных и аутентификации с использованием цифровых подписей. Keytool также позволяет пользователям администрировать секретные ключи, используемые при симметричном шифровании/дешифровании (например, DES). Пользователь имеет возможность самостоятельно генерировать эти пары ключей, после чего он их сохраняет в хранилище ключей (keystore).

Keystore - это защищенный файл или правильнее сказать база данных, которая выступает в роли специального, защищенного хранилища открытых ключей, сертификатов, секретных ключей.

Закрытый и открытый ключи используются в асимметричном шифровании. Открытый ключ может иметь связанный сертификат. Сертификат - это цифровой документ, удостоверяющий личность человека, организации или устройства, претендующего на владение открытым ключом. Сертификат обычно имеет цифровую подпись проверяющей стороны в качестве доказательства (Удостоверяющие центры).

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

Все это многообразие используется приложениями Java для:

Keystore умеет работать в ситуации, когда в процессе работы необходима аутентификация сервера и клиента, где все реализовано с помощью SSL соединения, подразумевающее использование приватных ключей и сертификатов и так же keystore применяется при односторонней аутентификации, но только на стороне сервера. Java KeyStore представлен классом java.security.KeyStore. Поскольку KeyStore общедоступен, пользователи JDK могут создавать дополнительные приложения безопасности, которые его используют.

Типы поддерживаемых форматов в keystore

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

Реализации Keystore основаны на провайдере. Более конкретно, интерфейсы приложений, предоставляемые KeyStore, реализованы в терминах "Интерфейс поставщика услуг" (Service Provider Interface - SPI). То есть существует соответствующий абстрактный класс KeystoreSpi, также в пакете java.security, который определяет методы интерфейса поставщика услуг, которые должны реализовывать " провайдеры-поставщики". (Термин «поставщик» относится к пакету или набору пакетов, которые предоставляют конкретную реализацию подмножества служб, к которым может обращаться API безопасности Java.)

Приложения могут выбирать различные типы реализаций хранилища ключей от разных поставщиков, используя фабричный метод getInstance, предоставленный в классе KeyStore . Тип хранилища ключей определяет хранилище и формат данных информации хранилища ключей, а также алгоритмы, используемые для защиты личных ключей в хранилище ключей и целостности самого хранилища ключей. Реализации Keystore разных типов несовместимы. keytool работает с любой файловой реализацией хранилища ключей. (Он обрабатывает расположение хранилища ключей, которое ему передается в командной строке, как имя файла и преобразует его в FileInputStream, из которого он загружает информацию о хранилище ключей.) Инструменты jarsigner и policytool, с другой стороны, могут читать хранилище ключей из любого места, которое можно указать с помощью URL.

Если вы не укажете явно тип хранилища ключей, инструменты выберут реализацию хранилища ключей просто на основании значения свойства keystore.type, указанного в файле свойств безопасности. Файл свойств безопасности называется java.security и находится в каталоге свойств безопасности JDK, java.home/lib/security. Каждый инструмент получает значение keystore.type, а затем проверяет все установленные на данный момент провайдеры, пока не найдет того, который реализует хранилища ключей этого типа. Затем он использует реализацию хранилища ключей от этого провайдера.

Где хранится Keystore и что такое алиас

Где скачать утилиту keytool

Утилита Keytool входит в состав Java SDK (или JRE), в большинстве компьютеров в основном установлена JRE версия. В Windows данную утилиту можно найти по пути:

Тут все зависит от разрядности Java. На скриншоте отмечен файл Keytool.exe.

скачать Keytool

Как запустить утилиту Keytool в Windows

Сейчас я вам расскажу, как вы можете запускать утилиту Keytool в операционных системах Windows. Откройте командную строку в режиме администратора. Далее выполните вот такую команду, чтобы перейти в расположение утилиты:

cd C:\Program Files (x86)\Java\jre1.8.0_201\bin\ или cd C:\Program Files\Java\jre1.8.0_201\bin\ (Хочу отметить, что у вас будет своя версия отличная моей jre1.8.0_201)

запуск Keytool в Windows

Далее вы просто пишите keytool.exe и нажимаете Enter, в результате чего вы увидите справку по утилите.

запуск Keytool в Windows-2

Так же утилиту keytool.exe вы можете запускать и в оболочке PowerShell. Откройте ее от имени администратора или другого пользователя с аналогичными правами. Для этого в оболочке введите:

После чего введите .\keytool.exe

Открыть keytool.exe в powershell

Команды и примеры использования утилиты Keytool

  • Получение справки по утилите Keytool. Первое, что я хочу, чтобы вы научились, это использование справки, чтобы представлять, как строится конструкция команд и их возможности. Вводим просто Keytool, у вас появятся основные ключи, которые покажут, что вы можете делать через утилиту
C:\Program Files (x86)\Java\jre1.8.0_201\bin>keytool.exe
Key and Certificate Management Tool

-certreq - генерация CSR запроса
-changealias - изменить запись алиаса
-delete - удалить запись
-exportcert - экспортировать сертификат
-genkeypair - генерация пары ключей
-genseckey - генерация секретного ключа
-gencert - генерация сертификата из csr запроса
-importcert - импорт сертификата или цепочки
-importpass - импорт паролей
-importkeystore - импорт одной или нескольких записей из другого Keystore
-keypasswd - изменить пароль у записи
-list - список всех записей в хранилище сертификатов
-printcert - вывод содержимого сертификата
-printcertreq - вывод содержимого CSR запроса
-printcrl - вывод содержимого CRL запроса
-storepasswd - изменить пароль на Keystore

Справка по утилите Keytool

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

keytool.exe -genkeypair -help и получаю вывод дополнительных ключей:

-alias <alias> alias name of the entry to process
-keyalg <keyalg> key algorithm name
-keysize <keysize> key bit size
-sigalg <sigalg> signature algorithm name
-destalias <destalias> destination alias
-dname <dname> distinguished name
-startdate <startdate> certificate validity start date/time
-ext <value> X.509 extension
-validity <valDays> validity number of days
-keypass <arg> key password
-keystore <keystore> keystore name
-storepass <arg> keystore password
-storetype <storetype> keystore type
-providername <providername> provider name
-providerclass <providerclass> provider class name
-providerarg <arg> provider argument
-providerpath <pathlist> provider classpath
-v verbose output
-protected password through protected mechanism

It says that I must use keytool to export the signature for my app such as:

I do not know how to find the keytool in order to run it. I tried to open a Windows command prompt and paste the above command, but it did not work.

3,435 1 1 gold badge 23 23 silver badges 50 50 bronze badges


22.3k 30 30 gold badges 109 109 silver badges 159 159 bronze badges

22 Answers 22

I found a solution by myself as below quote. It works fine.



22.3k 30 30 gold badges 109 109 silver badges 159 159 bronze badges I found that only keytool -list -v -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore worked for me. Found here from Google :)

Simply enter these into Windows command prompt.

The base password is android

You will be presented with the MD5 , SHA1 , and SHA256 keys; Choose the one you need.


3,232 5 5 gold badges 27 27 silver badges 48 48 bronze badges 1,429 1 1 gold badge 9 9 silver badges 9 9 bronze badges this worked for me. For debug keys use the -alias androiddebugkey. I use for the release version next line: 1) cd C:\Program Files\Java\jdk1.8.0_162\bin and next 2) keytool -list -v -keystore "C:\AndroidProjects\Project1\app\myapp.keystore" keytool error: java.lang.Exception: Only one command is allowed: both -exportcert and -list were specified.

To get android key hash code follow these steps (for facebook apps)

  1. Download the openssl for windows here
  2. now unzip to c drive
  3. open cmd prompt
  4. type cd C:\Program Files\Java\jdk1.6.0_26\bin
  5. then type only keytool -export -alias myAlias -keystore C:\Users\<your user name>\.android\myKeyStore | C:\openssl-0.9.8k_WIN32\bin\openssl sha1 -binary | C:\openssl-0.9.8k_WIN32\bin\openssl enc -a -e
  6. Done

To get Certificate fingerprint(MD5) code follow these steps

  1. go to - C:\Program Files\Java\jdk1.6.0_26\bin
  2. inside the bin folder run the jarsigner.exe file
  3. open cmd prompt
  4. type cd C:\Program Files\Java\jdk1.6.0_26\bin
  5. then again type on cmd keytool -list -keystore "C:/Documents and Settings/<your user name>/.android/debug.keystore"
  6. it will ask for Keystore password now. The default is " android " type and enter
  7. Done.


2,196 2 2 gold badges 16 16 silver badges 25 25 bronze badges


I found the issue was I had left off the flags -list and -v

keytool is part of the JDK.

Try to prepend %\ to the exec statement or c:\\bin .

71.5k 16 16 gold badges 121 121 silver badges 118 118 bronze badges I put the cer file and truststore file in the same directory and used this command: "%JAVA_HOME%\bin\keytool" -import -keystore truststore -file certificate.cer -alias my-alias

I found this on another post, which did not get many upvotes, but it was super helpful for me. So will add it here.

Android Studio will bring a keytool with it.

C:\Program Files\Android\Android Studio\jre\bin

The KeyTool is part of the JDK. You'll find it, assuming you installed the JDK with default settings, in $JAVA_HOME/bin

21.3k 13 13 gold badges 61 61 silver badges 91 91 bronze badges

Robby Pond 's answer can be generalized to use JAVA_HOME environment variable and to also compensate for any blanks that might occur in the path (like Program Files ):

19.1k 15 15 gold badges 126 126 silver badges 136 136 bronze badges

keytool is located in JDK bin directory ($JAVA_HOME/bin). JAVA_HOME is your JDK installation directory. To use that command line you should also include $JAVA_HOME/bin to your PATH environment variable.

3,084 1 1 gold badge 19 19 silver badges 24 24 bronze badges

keytool is part of jdk, it should be $JAVA_HOME/bin/keytool

8,051 5 5 gold badges 23 23 silver badges 35 35 bronze badges

Keytool is part of the Java SDK. You should be able to find it in your Java SDK directory e.g. C:\Program Files\Java\jdk1.6.0_14\bin

2,533 1 1 gold badge 21 21 silver badges 27 27 bronze badges

On cmd window (need to run as Administrator),

only works if you have set up your system environment variable JAVA_HOME . To set up your system variable for your path, you can do this

Then, you can type

Then, execute any commands provided by JAVA jdk's, such as

You just have to answer the questions (equivalent to typing the values on cmd line) after hitting enter! The key would be generated


Keytool command can be run at your dos command prompt, if JRE has been set in your classpath variable.

For example, if you want to get the MD5 Fingerprint of the SDK Debug Certificate for android,

just run the following command.

where C:\Documents and Settings\user\.android> is the path which contains the debug.keystore that has to be certified.

13.6k 3 3 gold badges 44 44 silver badges 92 92 bronze badges


Depending on your version of Eclipse ( I am using Kepler). Go to Windows> Preferences>Android> Build.

You'll find the location path of your debug keystore as well as the SHA1 fingerprint (which you can just copy and use)

2,955 1 1 gold badge 21 21 silver badges 28 28 bronze badges

If you installed visual studio with Xamarin/mobile development support, you'll have a java install here C:\Program Files\Android\jdk\microsoft_dist_openjdk_\bin\ , as was my case.


1,071 2 2 gold badges 13 13 silver badges 26 26 bronze badges

KEYTOOL is in JAVAC SDK .So you must find it in inside the directory that contaijns javac

answer above, the below worked for me

Simply enter these into Windows command prompt.

Make sure the terminal is run as adminstrator

cd C:\Program Files\Android\Android Studio\jre\bin

keytool -list -v -keystore "C:\Users\admin.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android

N:B: This should be done after the first build, as the keys are only generated after first build

keytool comes with the JDK. If you are using cygwin then this is probably on your path already. Otherwise, you might dig around in your JDK's bin folder.

You'll probably need to use cygwin anyways for the shell pipes ( | ) to work.

44.3k 10 10 gold badges 96 96 silver badges 87 87 bronze badges Could you tell me how to run below command? keytool -exportcert -alias androiddebugkey -keystore

/.android/debug.keystore | openssl sha1 -binary | openssl base64

I installed openssl package already. The problem still occurs :( Can you run openssl by itself? What options do you see when you type "open" and press tab?

Few observations while I was getting the same problem (Windows). 1. Shell pipe is important. 2. If you are using OpenSSL or Cygwin, definitely you have to install it. 3. keytool comes with JDK so either you have to point to it in the command or you have cd to the JDK/bin folder (where the exe resides) 4. The debug keystore is typically located at

/.android/debug.keystore 5. password is "android" whether you -keypass it or type it when prompted. 6. For the alias name, you can open (DO NOT SAVE, just open and close) the keystore file with any editor and read it. 7. MOST IMPORTANT - There is a difference is specifying the keystore path within quotes and without. I got it working by using the keystore path within the double quotes. As remix090378 said and as per the instruction, this command indeed worked - cd C:\Program Files\Java\jdk1.7.0_09\bin

keytool -exportcert -alias androiddebugkey -keystore "C:\Users\userName.android\debug.keystore" -list -v

In my case, I had already generated an APK file using the command ionic cordova build android --prod and I needed to get the SHA-1 fingerprint for the already existing APK file. Here's how I got it by running the following command in the App directory:

I have tried to execute keytool from Java bin directory but I get an error with warning bash: keytool: command not found.

113k 27 27 gold badges 259 259 silver badges 359 359 bronze badges 1,485 1 1 gold badge 10 10 silver badges 9 9 bronze badges

13 Answers 13

These are the steps which solved my problem:

Search the path where my java was installed

Move to java directory (where jre was installed on my server)

Create SSL certificate with keytool command


1,743 2 2 gold badges 25 25 silver badges 30 30 bronze badges 1,485 1 1 gold badge 10 10 silver badges 9 9 bronze badges @user217929 how can we solve this problem by adding keytool to $PATH so that the command can be executed from any directory? note that the keytool is not in the jre folder, but in the bin folder 9,291 16 16 gold badges 57 57 silver badges 96 96 bronze badges

Ensure jre is installed.

As keytool file is present in the bin folder of jre, give path till bin as in the command above.

Then you can do:

The additional option -keystore will help you to specify the path where you want the generated self signed certificate.

3,361 1 1 gold badge 17 17 silver badges 8 8 bronze badges

find your jre location :: sudo find / -name jre And then :: sudo update-alternatives --install /usr/bin/keytool keytool /opt/jdk/<jdk.verson>/jre/bin/keytool 100

If you are looking for keytool because you are working with Android studio / Google Firebase, there is a keytool bundled with Android Studio. After extracting the zip file, the path to keytool is android-studio/jre/bin .

It seems that calling sudo update-alternatives --config java effects keytool. Depending on which version of Java is chosen it changes whether or not keytool is on the path. I had to chose the open JDK instead of Oracle's JDK to not get bash: /usr/bin/keytool: No such file or directory .


Keytool comes with your Java library. So you have to execute the Keytool command from your /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin directory. Or you can add JAVA_HOME to your environmental variables (Windows) or


9,840 1 1 gold badge 60 60 silver badges 56 56 bronze badges

This worked for me


24.2k 20 20 gold badges 64 64 silver badges 113 113 bronze badges



You could also put this on one line like so:

/path/to/jre/bin/keytool -genkey -alias [mypassword] -keyalg [RSA]

Wanted to include this as a comment on piet.t answer but I don't have enough rep to comment.

Note that they say you can type in space separated folder names like /"Program Files"/ with quotes but I found in bash i had to separate with back slashes like /Program\ Files/.


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

Введение

Если говорить о формате настройки сертификатов для безопасной передачи данных. Как правило, данные действия производят на каком-либо веб-сервере типа nginx или apache, стоящем на входе во внутреннюю сеть компании и dmz. Благодаря ему можно разделить защищенную внутреннюю сеть и внешнюю сеть интернет. Далее, внутри доверенной сети каждый поступает по-разному. Кто-то считает, что все внутренние сервисы могут взаимодействовать друг с другом без каких-то ограничений, и контроль пользователей управляется уже в GUI посредством логина и пароля для конкретного приложения с разграничением ролей в рамках приложения. Кто-то идет дальше, подключая LDAP и используя логин, пароль пользователя из общего хранилища.

Существуют различные протоколы и технологии типа RADIUS, Kerberos или OAuth/OpenID для работы с вопросами аутентификации. Кто-то использует схемы с базовой аунтефикацией, передавая логин и пароль в base64, кто-то использует JsonWebToken, еще существует возможность использования сертификатов для проверки не только сервера и клиента. В результате получается ситуация, что мы формируем защищенное соединение клиента и сервера, в котором шифруем передаваемые данные и доверяем не только серверу, с которого эти данные забираем, но и знаем о том, кто именно забирает эти данные с нашего сервера, так как он предоставляет клиентский сертификат.

В рамках моей работы в ТехЦентре Дойче Банка мы в обязательном порядке для всех межсервисных взаимодействий используем SSL-сертификаты — даже в UAT окружении. В Java используем JKS, как более привычный контейнер сертификатов и паролей для этой системы.

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

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

Терминология

Формат сертификатов

В рамках работы с сертификатами обычно используется контейнер PKCS 12 для хранения ключей и сертификатов, но в рамках Java, в дополнение широко используется проприетарный формат JKS (Java KeyStore). Для работы с хранилищем JDK поставляется с консольной утилитой keytool.

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

Есть ряд других команд под катом, которые могут быть полезны в работе с JKS и просто с ключами и сертификатами в Java

  • Создание запроса сертификата (CSR) для существующего Java keystore
  • Загрузка корневого или промежуточного CA сертификата
  • Импорт доверенного сертификата
  • Генерация самоподписанного сертификата и keystore
  • Просмотр сертификата
  • Проверка списка сертификатов в keystore
  • Проверка конкретного сертификата по алиасу в keystore
  • Удаление сертификата из keystore
  • Изменение пароля для keystore
  • Экспорт сертификата из keystore
  • Список доверенный корневых сертификатов
  • Добавление нового корневого сертификата в trustStore

KeyStore & TrustStore

Говоря о JKS, стоит отметить, что данные файлы могут использоваться как KeyStore так и TrustStore. Это два различных типа хранилищ, которые находятся в JKS файлах. Одно из них (KeyStore) содержит более чувствительную информацию типа приватного ключа, и поэтому требует пароля для доступа к этой информации. В противовес чему TrustStore хранит информацию о доверенных сертификатах, которые конечно же присутствуют в операционной системе. Например, для Linux систем мы сможем их найти в /usr/local/share/ca-certificates/

Но так же эти сертификаты идут в поставке Java в файле cacerts, который по умолчанию расположен в директории java.home\lib\security и имеет пароль по умолчанию changeit.

Данная информация может быть полезна в тех случаях, когда установка JDK/JRE осуществляется в компании централизовано из одного источника, и имеется возможность добавления туда своих доверенных сертификатов компании для prod/uat окружения.

Ниже приведена таблица с некоторыми различиями KeyStore & TrustStore.

Подключение SSL к NettyServer

При создании нового проекта, подразумевающего взаимодействие клиента и сервера бинарными данными(protobuf) через защищенные вебсокеты (wss), возник вопрос подключения SSL в netty сервер. Как оказалось, это не представляет особых проблем, достаточно в билдере сетевого интерфейса добавить метод .withSslContext(), в который необходимо передать созданный контекст.

Для того что бы сформировать серверный и клиентский SSL-контекст можно использовать один единственный билдер — SslContextBuilder и его методы — forServer и forClient. У этого билдера надо заполнить ряд обязательных полей, такие как trustManager и keyManager. Эти менеджеры мы можем получить из соответствующий фабрик — TrustManagerFactory и KeyManagerFactory.

Синтаксис данных фабрик практически аналогичен с разницей в том, что для trustManager-а мы используем только пароль для самого jks файла,

а для KeyStore при инициализации нам необходимо дополнительно передать пароль от самого ключа.

И в целом это все, что необходимо для добавления SSL в NettyServer.

Подключение SSL в gRPC / RSocket

Если говорить о двунаправленном обмене бинарными данными, современных тенденциях к написанию реактивных приложений, стоит отметить gRPC и RSocket для создания подобных приложений. Но поскольку в основании этих протоколов можно использовать Netty как транспорт, логика конфигурирования останется. Поэтому я не буду уделять этому много внимания.

Подключение SSL в Spring Boot для RestController

И все будет сделано за вас. Либо, если требуется более кастомная конфигурация, поднятие коннекторов на разных портах с нестандартными настройками и так далее, тогда путь лежит в сторону использования интерфейса WebServerFactoryCustomizer, имплементации которого существуют для всех основных контейнеров будь то Jetty, Tomcat или Undertow.

Поскольку это функциональный интерфейс, его довольно просто можно описать через lambda c параметром типа Connector. Для него мы можем выставить флаг setSecure(true), затем заполнить необходимые параметры для ProtocolHandler-а, выставив ему пути до jks c keystore и trustStore и соответствующие пароли к ним. Например, для tomcat код будет выглядеть подобным образом:

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

Тестирование TLS/SSL

Для того чтобы провести тестирование реализованного безопасного подключения имеется возможность создать keystore программно, используя классы из пакета java.security.* Это даст возможность тестировать различное поведение системы в случае разных ситуаций типа истекших сертификатов, проверки корректной валидации доверенных сертификатов и так далее.

Чтобы грамотно проверить работоспобность придется пройти по всем составным частям jks и воссоздать программно внутри KeyStore пару ключей KeyPair, свой сертификат X509Certificate, цепочку родительских сертификатов, подпись и доверенные корневые сертификаты.

Для упрощения этой задачи можно воспользоваться библиотекой bouncyСastle, которая предоставляет ряд дополнительный возможностей в дополнение к стандартным классам в Java, посвященным криптографии из Java Cryptography Architecture (JCA) и Java Cryptography Extension (JCE).

На верхнем уровне абстракции создание keyStore для целей тестирования может выглядеть следующим образом:

Здесь мы, соответственно, можем увидеть наш доверительный корневой сертификат CA, сертификат cert, который выпущен промежуточным звеном, и нашу пару ключей (приватный и публичный), которые хранятся вместе с сертификатом в поле KeyPair keyPair класса X509Certificate2, расширяющем X509Certificate.

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

Соответственно, остается нюанс в непосредственном написании двух билдеров — X509Certificate2Builder и KeyStoreBuilder. Конечно же в java существует java.security.KeyStore.Builder, но он весьма общего плана и имеет единственный ценный метод — newInstance, а хочется чего-то более явного для добавления доверенных сертификатов и приватных ключей. По этой причине был написан свой билдер.

Свой билдер использует в конечном итоге метод setEntry класса KeyStore для единообразного добавления сущностей доверенных сертификатов и приватных ключей, используя различные имплементации типа Entry (TrustedCertificateEntry или PrivateKeyEntry).

и метод addTrustedCertificate,

которые мы использовали выше при генерации keyStore.

C билдером X509 сертификата дела обстоят чуть сложнее, поскольку основная часть логики там будет сосредоточена в методе build(). Чтобы не загромождать статью болейрплейт кодом сеттеров, которые просто устанавливают значения полей билдера, я сразу перейду к реализации метода build() для X509Certificate2, опустив методы, связанные с установкой значений в билдер, и использую вместо них локальные переменные:

Все недостающие в стандартной библиотеке классы импортированы из bouncycastle.
В начале работы необходимо проинициализировать провайдер bouncycastle, если это еще не было сделано ранее.

Пара ключей генерируется с использованием java.security.KeyPairGenerator, который позволяет создать ключи с заданный алгоритмом и хеш-функцией. В данном примере был использован RSA c SHA1PRNG.

Далее мы объявляем поля, необходимые для сертификата, такие как даты начала и окончания, эмитент и серийный номер.

Затем мы добавляем расширения для сертификата, описывающие субъект и указание корневого сертификата, подписавшего его. В конце концов, получаем сертификат.

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

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

В результате, например, для проверки безопасного соединения в Spring boot приложении без использования стандартного пути с пропертями достаточно будет создать шаблонное приложение с вебом, например, через Spring Initializr и

Читайте также: