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

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

Что я делаю неправильно?

Ответ 1

Использование 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

Ответ 2

jarsigner может использовать ваш файл pfx в качестве хранилища ключей для подписания вашей банкой. Убедитесь, что ваш файл 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

Ответ 3

Я нашел эту страницу, в которой рассказывается, как импортировать 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

Ответ 4

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

Edit

Дополнительная информация:

  • Загрузите OpenSSL для Windows здесь.
  • Экспорт закрытого ключа: openssl pkcs12 -in filename.pfx -nocerts -out key.pem
  • Экспорт сертификата: openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem
  • Импортировать закрытый ключ и сертификат в хранилище ключей Java с помощью keytool.

Ответ 5

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

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

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

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

Ответ 6

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

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