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

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

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

Ответы [ 6 ]

241 голосов
/ 17 января 2011

Использование 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
22 голосов
/ 04 мая 2011

jarsigner может использовать ваш pfx-файл в качестве хранилища ключей для подписи вашего jar-файла. Убедитесь, что ваш файл pfx имеет закрытый ключ и цепочку сертификатов при экспорте. Нет необходимости конвертировать в другие форматы. Хитрость заключается в том, чтобы получить Alias ​​ вашего файла 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
16 голосов
/ 20 июля 2012

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

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

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

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

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

2 голосов
/ 18 ноября 2010

Ваш файл 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.
0 голосов
/ 13 октября 2013

Если вы работаете с 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...