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

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

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

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

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 

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

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

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

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

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

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

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

  • HTTPS с NSURLConnection - NSURLErrorServerCertificateUntrusted
  • Как предоставить ASP.NET доступ к закрытому ключу в сертификате в хранилище сертификатов?
  • Как создать самозаверяющий сертификат с помощью C #?
  • Не удалось создать путь PKIX: не удалось найти допустимый путь сертификации для запрошенной цели
  • Как проверить, подписана ли APK или «отладить сборку»?
  • проверка сертификата сервера не удалась. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
  • Как установить доверенный сертификат CA на Android-устройство?
  • Как подписать апплет Java для использования в браузере?
  • Как игнорировать создание пути PKIX не удалось: sun.security.provider.certpath.SunCertPathBuilderException?
  • Получение Chrome для принятия самоподписанного локального сертификата
  • веб-просмотр android с сертификатом клиента
  • Interesting Posts

    Выполнение запросов mongoose.js синхронно

    Можете использовать Bluetooth-гарнитуры для вывода звука, повреждающего их?

    Пространство имен для

    График Excel не отображает все серии данных

    Что такое простой пример ошибки с плавающей точкой / округлением?

    Как определить версию приложения в одном месте для нескольких приложений?

    Обновление библиотеки поддержки Android до 23.2.0 вызывает ошибку: XmlPullParserException Бинарная строка XML-файла # 17 требует viewportWidth> 0

    Как я могу гарантировать, что разделение целых чисел всегда округляется?

    Символ Spring CSRF не работает, когда отправляемый запрос является многостраничным запросом

    Как изменить название пакета Android Project в Eclipse?

    c # мерцающий список в обновлении

    Как занести в черный список конкретную зону памяти в Windows?

    Как не анализировать в ElasticSearch?

    Использование преобразователей Json.NET для десериализации свойств

    Кэш SATA-2 64 МБ или SATA-3 32 МБ?

    Давайте будем гением компьютера.