Как создать хранилище ключей Java только с файлом закрытого ключа? - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть только закрытый ключ в виде файла .key, никаких других .crt или ca. Мне нужно создать хранилище ключей Java с этим. Как его преобразовать?

Что я пробовал до сих пор:
Я переименовал свой файл .key в .pem.
Я использовал openssl для создания файла .p12 из .pem.

И, наконец, я использую эту команду для создания хранилища ключей Java:

keytool -importkeystore -srckeystore [MY_FILE.p12] -srcstoretype pkcs12
-srcalias [ALIAS_SRC] -destkeystore [MY_KEYSTORE.jks]
-deststoretype jks -deststorepass [PASSWORD_JKS] -destalias [ALIAS_DEST]

Меня просят ввести пароли, которые я ввожу, и затем я получаю сообщение об ошибке:

PEM_read_bio:no start line: ...... Expecting: TRUSTED CERTIFICATE

Я уже проверил на наличие пропусков и что файл начинается с «-----» и заканчивается также на нем.

Кто-нибудь знает способ сделать это?

1 Ответ

1 голос
/ 09 ноября 2019

Вы не показывали команду openssl, которую использовали, но это, вероятно, неправильно, поскольку цитируемая вами ошибка происходит из openssl и not keytool, и в результате ваша команда keytool не могла работать.

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

Есть два способа сделатьэто. OpenSSL проще, но не программирует и, следовательно, не очень онтопичен:

openssl req -new -x509 -inkey privkey.pem [-days N] [-subj name] -out dummy.pem
# -subj name has the form /attr=value/attr=value/...
# where commonly used attrs are C (Country), ST (State/Province), 
# L (Locality), O (Organization), OU (Org Unit), CN (CommonName).
# if you omit -subj name you will be prompted for these (assuming normal config)
# -days defaults to 30
# if you modify the default config file or create and specify your own 
# you can configure a variety of X.509 extensions, but for a dummy cert 
# this is only rarely helpful, depending how you (will) use it

openssl pkcs12 -export -in dummy.pem -inkey privkey.pem -out keystore.p12 [-name alias]

# Java can use the PKCS12, but if you really want JKS for some reason
keytool -importkeystore -srckeystore keystore.p12 -destkeystore keystore.jks -deststoretype JKS \
  [-srcstorepass p] [-deststorepass p] [-srcalias x [-destalias y]]
# most j8 can read PKCS12 without specifying it (due to a compatibility setting) 
# and all j9 up autodetect the source type;
# j8 defaults dest type to JKS but j9 up do not

В качестве альтернативы вы можете запрограммировать это на Java. OOTB Java напрямую не обрабатывает формат PEM для ключей, и, что более важно, обрабатывает только один из восьми форматов, используемых OpenSSL - и вы тщательно избегаете сообщать нам, что у вас есть. Также в OOTB Java нет документированного способа создания сертификата;есть внутренние классы, используемые keytool, но после j8 становится все труднее использовать внутренние классы. Обе эти проблемы решаются с помощью BouncyCastle (bcpkix + bcprov), который поддерживает ключи PEM OpenSSL и, помимо прочего, генерирует сертификаты X.509.

Чтобы прочитать незашифрованный файл Privatekey в традиционном формате OpenSSL, см.
Считывание секретного ключа RSA формата PKCS1 в JAVA
Как загрузить закрытый ключ RSA из файла
Получение секретного ключа RSA из PEM BASE64 Закодированный приватный ключфайл ключа

или традиционный зашифрованный
Получить PrivateKey из файла .pem RSA
Расшифровка закрытого ключа OpenSSL PEM Encoded RSA с помощью Java?

Для PKCS8 в зашифрованном виде
Чтение PKCS8 в формате PEM: не удается найти поставщика
Расшифровать частный ключ PEM (RSA) с помощью Bouncy Castle
и так как вам на самом деле нужен также открытый ключ, который дают вам «традиционные» форматы (как PEMKeyPair -> KeyPair), но PKCS8 не
Надежный замок - как получить информацию об открытом ключе из JceOpenSSLPKCS8DecryptorProviderBuilder (мой)

Для создания самоподписанного сертификата с Bouncy
Самоподписанный сертификат X509 с Bouncy Castle на Java
Создание сертификата X509 с использованием Bouncy CastleJava (но не используйте SHA1)
возможно Создание сертификата X509 с использованием bouncycastle X509v3CertificateBuilder

...