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

17

У нас есть JAVA-сервер и клиент, которые общаются по сети, используя SSL. Сервер и клиент взаимно аутентифицируют друг друга, используя сертификаты. Тип хранилища ключей, используемый сервером и клиентом, - JKS. Сервер и клиент загружают свои файлы хранилища ключей и доверенных сертификатов. Имена файлов хранилища ключей и доверенных сертификатов: server.keystore, server.truststore, client.keystore и client.truststore. Я использую самоподписанные сертификаты только для тестирования.

Вопросов:

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

Q2. Могу ли я уменьшить количество шагов, чтобы добиться того же? Если да, то как?

Действия по созданию ключа RSA, самозаверяющих сертификатов, хранилища ключей и хранилища доверенных сертификатов для сервера

  1. Генерация закрытого ключа RSA

    openssl genrsa -out diagserverCA.key 2048
    
  2. Создайте сертификат x509

    openssl req -x509 -new -nodes -key diagserverCA.key \
                -sha256 -days 1024 -out diagserverCA.pem
    
  3. Создайте хранилище ключей PKCS12 из закрытого ключа и открытого сертификата.

    openssl pkcs12 -export -name server-cert \
                   -in diagserverCA.pem -inkey diagserverCA.key \
                   -out serverkeystore.p12
    
  4. Конвертировать хранилище ключей PKCS12 в хранилище ключей JKS

    keytool -importkeystore -destkeystore server.keystore \
            -srckeystore serverkeystore.p12 -srcstoretype pkcs12 
            -alias server-cert
    
  5. Импортируйте сертификат клиента в доверенное хранилище сервера.

    keytool -import -alias client-cert \
            -file diagclientCA.pem -keystore server.truststore
    
  6. Импортируйте сертификат сервера в хранилище доверенных сертификатов сервера.

    keytool -import -alias server-cert \
            -file diagserverCA.pem -keystore server.truststore
    

Действия по созданию личного ключа RSA, самозаверяющего сертификата, хранилища ключей и хранилища доверенных сертификатов для клиента

  1. Создать личный ключ

    openssl genrsa -out diagclientCA.key 2048
    
  2. Создайте сертификат x509

    openssl req -x509 -new -nodes -key diagclientCA.key \
                -sha256 -days 1024 -out diagclientCA.pem
    
  3. Создайте хранилище ключей PKCS12 из закрытого ключа и открытого сертификата.

    openssl pkcs12 -export -name client-cert \
                   -in diagclientCA.pem -inkey diagclientCA.key \
                   -out clientkeystore.p12
    
  4. Преобразовать хранилище ключей PKCS12 в хранилище ключей JKS

    keytool -importkeystore -destkeystore client.keystore \
            -srckeystore clientkeystore.p12 -srcstoretype pkcs12 \
            -alias client-cert
    
  5. Импортируйте сертификат сервера в доверенное хранилище клиента.

    keytool -import -alias server-cert -file diagserverCA.pem \
            -keystore client.truststore
    
  6. Импортируйте сертификат клиента в доверенное хранилище клиента.

    keytool -import -alias client-cert -file diagclientCA.pem \
            -keystore client.truststore
    
vic99
источник

Ответы:

3

Обычный https требует только 1 команды;

keytool -genkeypair

Если клиент не доверяет слепо какому-либо сертификату, вам необходимо скопировать общедоступный сертификат сервера на клиент.

Почему вы используете openssl вообще?

https://docs.oracle.com/javase/10/tools/keytool.htm

user1133275
источник
Пока мое редактирование не будет проверено коллегами: флаг -genkeypair, и вы можете добавить множество различных флагов для настройки сертификата (например, -validity 365 или -dname "cn = Марк Джонс, ou = JavaSoft, o = Sun, c = US «). Лучше всего увидеть ссылку в ответе для более подробной информации.
Йоханнес Штадлер
1
@JohannesStadler Спасибо, я одобрил ваши изменения и обновил ссылку на последнюю версию Java, обратите внимание, что «Эта команда называлась -genkey в предыдущих выпусках»
user1133275