Как преобразовать файл .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).