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

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

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

6 ответов


использование JDK 1.6 или более поздней версии

Он отметил Джастин в комментариях ниже, что один инструмент может сделать это, используя следующую команду (хотя только в 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

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

нашел этой страница, которая говорит вам, как импортировать PFX в JKS (Java Key Store):

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

ваш файл 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.

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

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

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

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


если вы работаете с JDK 1.5 или ниже, утилита keytool не будет иметь (см. документация JDK 1.5 keytool) и решение с помощью MikeD будет доступно только при передаче .pfx на машине с более новым JDK (1.6 или выше).

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