Как преобразовать файл .pfx в хранилище ключей с закрытым ключом?

107

Мне нужно подписать приложение для Android ( .apk).
У меня есть .pfxфайл. Я преобразовал его в .cerфайл через Internet Explorer, а затем преобразовал .cerв .keystorekeytool. Затем я попытался подписаться .apkс помощью jarsigner, но он говорит, что .keystore не содержит закрытого ключа.

Что я делаю не так?

Ола
источник
Это может быть полезно: как найти и запустить keytool для Windows stackoverflow.com/questions/5488339/…
Питер Барбаньяга,

Ответы:

259

Использование JDK 1.6 или новее

В комментариях ниже Джастин указал, что только keytool может сделать это с помощью следующей команды (хотя только в JDK 1.6 и новее):

keytool -importkeystore -srckeystore mypfxfile.pfx -srcstoretype pkcs12 
-destkeystore clientcert.jks -deststoretype JKS

Использование JDK 1.5 или ниже

OpenSSL может все. Этот ответ на JGuru - лучший метод, который я нашел до сих пор.

Прежде всего убедитесь, что у вас установлен OpenSSL . Во многих операционных системах он уже установлен, как я обнаружил в Mac OS X.

Следующие две команды преобразуют файл pfx в формат, который можно открыть как хранилище ключей Java PKCS12:

openssl pkcs12 -in mypfxfile.pfx -out mypemfile.pem
openssl pkcs12 -export -in mypemfile.pem -out mykeystore.p12 -name "MyCert"

ОБРАТИТЕ ВНИМАНИЕ, что имя, указанное во второй команде, является псевдонимом вашего ключа в новом хранилище ключей.

Вы можете проверить содержимое хранилища ключей с помощью утилиты Java keytool с помощью следующей команды:

keytool -v -list -keystore mykeystore.p12 -storetype pkcs12

Наконец, если вам нужно, вы можете преобразовать это в хранилище ключей JKS, импортировав хранилище ключей, созданное выше, в новое хранилище ключей:

keytool -importkeystore -srckeystore mykeystore.p12 -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS
MikeD
источник
28
нет необходимости выполнять все три шага, просто запустите: keytool -importkeystore -srckeystore mykeystore.pxf -destkeystore clientcert.jks -srcstoretype pkcs12 -deststoretype JKS
JustinMorris
Я думаю, что старые версии keytool не позволили бы вам этого сделать. Я помню, что 8 лет назад мне пришлось бы запустить openssl, но теперь с keytool в Oracle JDK 6 и 7 он работает как шарм, как и сказал Джастин.
Дэвид Броссар
2
Обратите внимание, что я дал этот ответ в более простой форме и более подробно за год до Джастина.
gjpc
@gjpc Отметил. Ваш ответ очень полный и заслуживает множества голосов :)
MikeD
Это действительно отличный ответ, и он спас меня после нескольких дней исследований. Этот ответ действительно заслуживает еще многих положительных отзывов. Спасибо, сэр.
Mythul
22

jarsigner может использовать ваш pfx-файл в качестве хранилища ключей для подписи вашего jar-файла. При экспорте убедитесь, что в вашем файле pfx есть закрытый ключ и цепочка сертификатов. Нет необходимости конвертировать в другие форматы. Хитрость заключается в том, чтобы получить псевдоним вашего файла pfx:

 keytool -list -storetype pkcs12 -keystore your_pfx_file -v | grep Alias

Если у вас есть псевдоним, подписать легко

jarsigner.exe -storetype pkcs12 -keystore pfx_file jar_file "your alias"

Две приведенные выше команды предложат вам ввести пароль, который вы указали при экспорте pfx. Если вы хотите, чтобы ваш пароль отображался в виде открытого текста, используйте переключатель -storepass перед переключателем -keystore

После подписания восхищайтесь своей работой:

jarsigner.exe -verify -verbose -certs  yourjarfile
gjpc
источник
1
+1 за то, что мне не пришлось конвертировать файл хранилища ключей (у меня его уже достаточно форматов!)
Trejkaz
22

Я нашел эту страницу, на которой рассказывается, как импортировать PFX в JKS (хранилище ключей Java):

keytool -importkeystore -srckeystore PFX_P12_FILE_NAME -srcstoretype pkcs12 -srcstorepass PFX_P12_FILE -srcalias SOURCE_ALIAS -destkeystore KEYSTORE_FILE -deststoretype jks -deststorepass PASSWORD -destalias ALIAS_NAME
каптан
источник
3
Это должен быть полный ответ!
JustAGuy 02
Я искал такой ответ - с псевдонимом
user3437460
У меня одна проблема, у pfx нет пароля, и -srcstorepassэто моя проблема. Этот PFX создан клиентом LetsEncrypt для Windows
FiruzzZ
2

Ваш PFX-файл должен содержать закрытый ключ. Экспортируйте закрытый ключ и сертификат прямо из файла PFX (например, с помощью OpenSSL) и импортируйте их в свое хранилище ключей Java.

редактировать

Дальнейшая информация:

  • Загрузите OpenSSL для Windows здесь .
  • Экспорт закрытого ключа: openssl pkcs12 -in filename.pfx -nocerts -out key.pem
  • Экспортный сертификат: openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
  • Импортируйте закрытый ключ и сертификат в хранилище ключей Java, используя keytool.
Бернар
источник
не могли бы вы рассказать мне, как я могу импортировать key.pem и cert.pem с помощью keytool?
Sad Al Abdullah
1
Небольшое дополнение: вы должны добавить -nodes в конце при экспорте private ky
morgan_il
2

Джастин (вверху) прав. Однако имейте в виду, что в зависимости от того, от кого вы получаете сертификат (промежуточный ЦС, задействованный корневой ЦС или нет) или как создается / экспортируется pfx, иногда может отсутствовать цепочка сертификатов. После импорта у вас будет сертификат типа PrivateKeyEntry, но с цепочкой длиной 1.

Чтобы исправить это, есть несколько вариантов. На мой взгляд, более простой вариант - импортировать и экспортировать файл pfx в IE (выбрав вариант «Включить все сертификаты в цепочку»). Процесс импорта и экспорта сертификатов в IE должен быть очень простым и хорошо документирован в другом месте.

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

Некоторые клиенты веб-служб на основе .Net выходят из строя (не могут установить доверительные отношения), если вы не сделаете вышеуказанное.

TechIsFun
источник
Похоже, это не работает в IE11. Не удается включить цепочку сертификатов, хотя я и говорю. Я знаю, что это работало в прошлом.
Брайан Кноблауч
0

Если вы работаете с JDK 1.5 или ниже, утилита keytool не будет иметь этой -importkeystoreопции (см. Документацию по JDK 1.5 keytool ), а решение от MikeD будет доступно только путем переноса .pfxна машину с более новой JDK (1.6 или выше).

Другой вариант в JDK 1.5 или ниже (если у вас есть продукт Oracle WebLogic) - следовать инструкциям из этого документа Oracle: Использование форматов сертификатов PFX и PEM с хранилищами ключей . В нем описывается преобразование в .pemформат, как извлечь информацию о сертификатах из этого текстового формата и импортировать ее в .jksформат с помощью java utils.ImportPrivateKeyутилиты (это утилита, включенная в продукт WebLogic).

Мариано Панига
источник