Как импортировать сертификат из GoDaddy для подписи кода Java?

Мне нужно иметь возможность подписывать файлы JAR с сертификатом от CA.

Я следую инструкциям из документации GoDaddy о том, как это сделать: http://support.godaddy.com/help/article/4780/signing-java-code

Однако на шаге 3 требуется импортировать файл сертификата, полученный с веб-сайта GoDaddy. Согласно документации, команда:

keytool -import -trustcacerts -keystore codesignstore -storepass <yourstorepwd> -alias codesigncert -file mycert.cer

Хотя я успешно отправил CSR (сгенерированный keytool) и получил ответ, я не могу понять, как получить файл mycert.cer. Существует возможность скачать файл PEM. Но после выполнения вышеприведенной команды я получаю сообщение об ошибке "Ошибка keytool: java.lang.Exception: Неполная цепочка сертификатов в ответе". Я пробовал это несколько раз, и дважды проверил, использую ли я правильное хранилище ключей. Я даже попытался повторно ввести ключ с использованием обоих SSH-1 один раз, а затем SSH-2 в другой раз. По словам этого человека ( https://stackru.com/questions/20793254/signing-a-jar-the-signers-certificate-chain-is-not-validated?rq=1), они смогли по крайней мере успешно импортировать файл PEM. Но я не уверен, что это даже правильный подход.

Техническая поддержка GoDaddy была абсолютно ужасной. Большинство техников, с которыми я говорил, совсем не знакомы с keytool, и мне потребовалось несколько попыток, чтобы позвонить им, прежде чем они направили меня в свой отдел SSL (480-505-8852), что по крайней мере несколько лучше, чем у общего служба поддержки.

Если я использую Internet Explorer или Firefox, я считаю, что могу автоматически генерировать CSR вместо того, чтобы создавать инструмент через ключ. Затем я экспортирую сертификат через веб-браузер. Читая различные другие онлайн документы, я думаю, что затем смогу использовать openssl для преобразования в правильный формат для keytool. Я не уверен в деталях того, как это будет работать, но я не вижу других вариантов.

Кто-нибудь был успешным с этим или есть какие-либо указатели о том, как действовать? Я нашел подобный вопрос здесь ( Подписание Java-апплета с помощью spc-файла от GoDaddy), но ответ просто указывает на плохую документацию GoDaddy. Я бы использовал другой центр сертификации, если бы мог, но я уже заплатил деньги и прошел долгий, длительный процесс проверки.

10 ответов

Решение

Обходной путь - связаться с GoDaddy и попросить их повторно выдать сертификат вашей организации. В процессе настройки сертификата вы должны выбрать сертификат кодового знака SHA-1 вместо SHA-2. Опция выбора SHA-1 будет доступна только в том случае, если срок действия вашего сертификата не продлен до 2016 года (см. Ниже), поэтому убедитесь, что они понимают, что вашей конечной целью является воссоздание вашего сертификата SHA-2 в качестве SHA-1, чтобы они знали, продать вам сертификат с правильным сроком действия.

Сегодня я обменял свой сертификат SHA-2 на SHA-1, и инструкции GoDaddy по подписанию кода Java работали отлично.

GoDaddy сообщил мне, что у Keytool могут возникнуть проблемы с импортом цепочки ответов сертификата, сгенерированной из их сертификата кодового знака SHA-2 (длина 2048). Я отказываюсь от суждения о Keytool, поскольку он импортирует сертификаты SHA-2 в порядке, когда корневой сертификат SHA1 GoDaddy извлекается из файла pem в ответе @mogsie.

GoDaddy автоматически использует SHA-2, когда выдает сертификаты кодового знака, срок действия которых истекает до 2017 года, поскольку Microsoft не примет менее SHA-2 с 1 января 2016 года, поэтому, если вы хотите приобрести сертификат SHA-1, он получит иметь кратковременное действие.

Проблема может исчезнуть с обновлением Java Keytool (я работал с 1.6), или если самоподписанный сертификат GoDaddy Sha256withRSA станет широко доверенным.

Так как процесс создания сертификата кодирования мне очень понравился (но не понравился), я подумал, что поделюсь процессом, через который я прошел, и, надеюсь, когда вам понадобится создать собственный, это избавит вас от душевной боли и боли.

Я использовал Godaddy, но я должен верить, что, кто бы ни был, CA шаги должны быть очень похожи.

Вот шаги, через которые я прошел:

(обратите внимание, что godaddy не создает сертификат кодовой подписи в формате jks, и для преобразования хранилища ключей в jks требуется дополнительный шаг)

Создать хранилище ключей:

keytool -genkey -alias codesigncert -keypass yourpassword -keyalg RSA - размер ключа 2048 -name "cn=server1.lccc.edu, OU= название колледжа, O= название колледжа, L=Schnecksville, ST= Пенсильвания,C=US" - хранилище ключей /home/oracle/codesignstore/codesignstore -storepass yourpassword -valid 720 (storepass и keypass могут совпадать)

Генератор ЭЛТ для Godaddy

keytool -certreq -v -alias codesigncert - файл /home/oracle/codesignstore/codesignstore.pem - хранилище ключей / home / oracle / codesignstore / codesignstore

с помощью редактора откройте CodeSignstore.pem и вставьте его в Godaddy сайт

Когда Godaddy проверит аккаунт и вы заплатите деньги, статус "в ожидании" исчезнет

зайдите в свой аккаунт godaddy ( https://mya.godaddy.com/)

нажмите на myaccount в верхней части страницы (в черном заголовке)

нажмите на управление SSL-сертификатами

выберите сертификат кодовой подписи из списка

нажмите на кнопку запуска

скачать файл как файл PEM

сохраните его на локальном компьютере

откройте Firefox, в расширенном разделе выберите просмотр сертификатов и

сертификат должен быть указан в управляемых представлениях.

выделите сертификат и выберите резервную копию (экспорт) и сохраните его как файл pkcs12

щелкните на представлении сертификатов в верхней части экрана, рядом со средством просмотра сертификатов есть псевдоним в двойных кавычках, прямо здесь он будет псевдонимом, который будет использоваться в команде jarsigner ниже

скопируйте файл на сервер, где будет находиться сертификат о подписи

используется: (например, server1 /home/oracle/code_sign_cert_from_godaddy/ godaddy_pkcs12.p12) * это новое хранилище ключей

поскольку хранилище ключей должно быть типа jks, а godaddy не создает файл jks, его необходимо преобразовать в формат jks

конвертировать pcks12 в jks

keytool -importkeystore - srckeystore / home / oracle / code_sign_cert_from_godaddy / godaddy_pkcs12. p12 -srcstoretype pkcs12 - destkeystore /home/oracle/code_sign_cert_from_godaddy/godaddy_jks.jks -deststoretype jks

обработка файла jar:

unsign jacob.jar... я скопировал файл jacob.jar в тестовый каталог /test_jacob и переименовал его в jacob1.jar (примечание 760815.1)

jar xf jacob1.jar

извлекает в папки "com" ​​и "META-INF", удаляет папку "META-INF"

удалить старый jacob1.jar

пересоздать jacob1.jar из каталога /test_jacob

jar -cvf jacob1.jar *

запустите jarsigner -verify jacob1.jar, должен отображаться без подписи.

создать текстовый файл вызов mymanifest.txt

  Permissions: all-permissions

  Codebase: *

  Application-Name: OracleForms

jar -ufm jacob1.jar mymanifest.txt (это помещает новую информацию о манифесте в файл jar)..

Вы можете открыть jacob1.jar в каталоге unzip jacob1.jar -d, где будет находиться unzip, чтобы убедиться, что файл mymanifest.txt теперь является частью файла jar.

подписать файл

jarsigner - хранилище ключей /home/oracle/code_sign_cert_from_godaddy/godaddy_jks.jks - storepass yourpassword - подписанный_jar /home/oracle/Oracle/Middleware/Oracle_FRHome1/forms/java/tes t_jacob/ подписанное сообщество jacob1.jar, inc. id" (этот псевдоним получен из процесса Firefox выше)

опция файла - signedjar требовалась, без этого я получал ошибки

обратите внимание, что псевдоним всегда является последней записью в команде jarsigner и

опция –alias отсутствует, как в команде keytool

проверить файл JAR подписан

jarsigner -verify Signedjacob1.jar будет отображать:

баночка проверена.

показать что в файле jar

jar -tvf Signedjacob1.jar

файл.SF находится внутри файла.jar, файл.DSA заменяется на файл.RSA

файл, который также находится внутри файла.jar

с выхода jar -tvf Signedjacob1.jar

2721 Пн Май 05 15:57:08 ПО ВОСТОЧНОМУ ВРЕМЕНИ 2014 META-INF / LEHIGH_C.SF

4231 Пн Май 05 15:57:08 ПО ВОСТОЧНОМУ ВРЕМЕНИ 2014 МЕТА-ИНФ /LEHIGH_C.RSA

Я скопировал файл Signedjacob1.jar в каталог $ORACLE_HOME/forms/java, а затем с помощью

войдите в систему менеджера интернет-магазина

Я изменил параметр webutilarchive с Jacob.jar на Signedjacob1.jar для каждого экземпляра

( em >> формы >> веб-конфигурация >> имя экземпляра >> все (первая запись должна быть параметром архива)

При замене jacob.jar на Signedjacob1.jar я сделал это для каждого из моих тестовых экземпляров, прежде чем я сделал это для производства, на всякий случай.

Остановитесь и запустите wls_forms, и вы должны хорошо идти..

Ответ, как упомянуто Waterbear, заключается в том, чтобы ваш сертификат GoDaddy был переиздан или повторно введен GoDaddy с помощью SHA-1, Причина в том, что GoDaddy имеет два CA-сервера: Class 2 CA который используется для подписи SHA-1 сертификаты и G2 CA который используется для подписи SHA-2 сертификаты. Пока старше Class 2 CA доверяет Java Truststore (и, таким образом, SHA-1 certificates доверяют), новее G2 CA нет, поэтому его SHA-2 сертификаты не являются доверенными, если вы не установили его корневой сертификат вручную (что в первую очередь противоречит цели покупки сертификата). Надеюсь, GoDaddy's G2 CA скоро Truststore станет доверенным (до 2016 года!), но пока это не произойдет, GoDaddy SHA-2 сертификат не лучше, чем самоподписанный сертификат.

@Waterbear Большое спасибо за ваше решение о получении сертификата SHA-1 вместо SHA-2. Это была определенно проблема, с которой я столкнулся. (Я бы опубликовал это под вашим комментарием, но Stackru сказал, что это слишком долго.) Я получил трехлетний сертификат, и по умолчанию GoDaddy предоставляет SHA-2 для сертификатов, срок действия которых истекает после определенной даты. Тем не менее, даже когда я повторно набрал номер и попросил SHA-1, я все равно получил SHA-2. Мне пришлось отозвать свой сертификат, а затем начать процесс с нуля, чтобы получить сертификат SHA-1. (Начиная с нуля, я имею в виду, что GoDaddy должен снова подтвердить вашу компанию, номер телефона и все такое.) Кстати, если вы все же отзываете свой сертификат, сначала убедитесь, что вы запрашиваете у GoDaddy разрешение, потому что технически им не нужно давать Вы возврат. Кроме того, я не смог получить трехлетний сертификат, потому что все, что истекает после определенной даты (2016?), Должно быть SHA-2, а не SHA-1. В основном мне пришлось получить возмещение за мой трехлетний сертификат и вместо этого получить годовой сертификат, чтобы даже иметь опцию SHA-1. Но после перехода с SHA-1 инструкции GoDaddy в подходе #1 работали нормально. Я бы порекомендовал сделать генерацию CSR вручную с помощью команды keytool (а не автоматически через веб-браузер). Позже вы просто скачиваете файл PEM и импортируете его в хранилище ключей с помощью команды keytool. (Это то, что GoDaddy описывает в "подходе 1" по ссылке, размещенной в вопросе.)

И наконец, если вам необходимо переиздать сертификат и повторить этот процесс, я настоятельно рекомендую выбрать другую компанию, кроме GoDaddy, для подписи кода. Их техническая поддержка была абсолютно ужасной. Их специалисты по поддержке даже признались мне, что их этому не учили. Часы, потраченные на этот вопрос, значительно компенсируют любые деньги, сэкономленные на сертификате

Я обнаружил, что из четырех сертификатов, которые вы получаете при загрузке Godaddy PEM, первым является самоподписанный корневой сертификат.

Чтобы увидеть цепочку (в Unix):

keytool -printcert -file response-from-godaddy.pem | grep -C1 ^Owner

Ответ показывает четыре сертификата, которые составляют цепочку, вплоть до корня.

Certificate[1]:
Owner: OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
Issuer: OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
--
Certificate[2]:
Owner: CN=Go Daddy Root Certificate Authority - G2, OU=https://certs.godaddy.com/repository/, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
Issuer: OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
--
Certificate[3]:
Owner: CN=Go Daddy Secure Certificate Authority - G2, OU=http://certs.godaddy.com/repository/, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
Issuer: CN=Go Daddy Root Certificate Authority - G2, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
--
Certificate[4]:
Owner: CN=REDACTED
Issuer: CN=Go Daddy Secure Certificate Authority - G2, OU=http://certs.godaddy.com/repository/, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US

По-видимому, первый уже в стандарте Java cacerts в качестве доверенного корневого сертификата. Тот факт, что это в.pem файл отключений keytool вверх.

Я несколько раз боролся с одной и той же проблемой повторного ввода, и мне повезло:

  • Откройте файл PEM.
  • Удалить первый блок ----BEGIN в ----END,
  • Запустить свой keytool -import в файле, содержащем оставшиеся три сертификата.

Presto!

keytool -importcert -v -trustcacerts -keystore XXX -alias codesigning -file 234.pem

Результат:

Certificate reply was installed in keystore
[Storing XXX]
keytool -import -trustcacerts -keystore codesignstore -storepass <yourstorepwd> -alias codesigncert -file mycert.cer

Во-первых, вы ** ДОЛЖНЫ ИМЕТЬ ** файл mycert.cer. В противном случае у вас нет возможности импортировать сертификат.

Получить "Ложь земли" - что находится в текущем файле хранилища ключей? Мы хотим перечислить (или показать), что находится в хранилище ключей..

keytool -list -v -keystore codesignstore

Если он запрашивает у вас пароль, вы можете просто нажать клавишу ВВОД, и он будет лаять о том, что ему не доверяют, но для удобства это нормально.

Если вы хотите "накачать" результаты в текстовый файл..

echo.|keytool -list -v -keystore codesignstore > kstore_result.txt

Примечание: эхо. Мне нравится то, что я упоминал ранее о "нажатии ENTER", так что не слишком привязывайтесь к этому.:)

keytool -genkey -alias codesigncert -keyalg RSA -validity 1825 -keysize 2048 -keypass <yourstorepwd> -keystore codesignstore -storepass <yourstorepwd>

Другие опции:

-genkey = generate a key
-keyalg RSA = use RSA's key alogorithm
-validity 1825 = how long is the key good for?  Primarily used with self-signed certs as the certs from verisign or Thawte have their own expiration
-keysize 2048 = Is this a 1024 or 2048-bit enryption?
-keypass <yourstorepwd>
-keystore codesignstore
-storepass <yourstorepwd>

Здесь вы должны быть очень осторожны, и служба поддержки не скажет вам об этом. Если вы попытаетесь импортировать другие сертификаты наряду с существующими, вам следует быть осторожным, чтобы не испортить все это.:)

Если у вас, конечно, есть проблема, вы можете удалить псевдоним и импортировать снова.

keytool -delete -alias codesigncert -storepass <yourstorepwd> -keystore codesignstore

Одна из вещей, которые мне нравится делать, - это "составлять" команду, чтобы быть уверенным, что я работаю по списку.

Например, у вас есть от Godaddy:

keytool -import -trustcacerts -keystore codesignstore -storepass <yourstorepwd> -alias codesigncert -file mycert.cer

Затем я беру каждую команду и настраиваю ее следующим образом, чтобы "пройтись" по списку:

keytool
-import
-trustcacerts
-keystore codesignstore
-storepass <yourstorepwd>
-alias codesigncert
-file mycert.cer

Затем, глядя на этот список, моя версия keytool поддерживает каждый из них? У вас есть -импорт как первый..

Я просто запустил keytool -help и не вижу: -import, но вижу -importcert

Там может быть проблема там?

Oracle показывает нам.. http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html

Так что, возможно, вам придется внести некоторые коррективы..

Вот тот, который я установил на одном из наших локальных серверов Apache Tomcat (Windows):

%JAVA_HOME%\bin\keytool -delete -alias tomcat -storepass somepass -keystore %JAVA_HOME%\bin\.keystore

А потом..

%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA -validity 1825 -keysize 2048 -keypass somepass -keystore %JAVA_HOME%\bin\.keystore -storepass somepass
What is your first and last name?
  [Unknown]:  secure.someserver.com
What is the name of your organizational unit?
  [Unknown]:  COMPANY
What is the name of your organization?
  [Unknown]:  COMPANY
What is the name of your City or Locality?
  [Unknown]:  ANYTOWN
What is the name of your State or Province?
  [Unknown]:  MI
What is the two-letter country code for this unit?
  [Unknown]:  US
Is CN=secure.someserver.com, OU=COMPANY, O=COMPANY, L=ANYTOWN, ST=MI, C=US correct?
  [no]:  yes

Примечание. Когда вы запустите это, вы не увидите, успешно оно или нет.

Давайте начнем здесь и посмотрим, каковы результаты..

У меня была ошибка сертификата (CA не является доверенным) с использованием Java-плагина Chrome/FF для развертывания приложения с моего веб-сервера (поэтому не Java-апплет). Проблема была решена для меня при добавлении других сертификатов CA Godaddy (промежуточных) на мой веб-сервер. Я создал билет с Godaddy, и они ответили (довольно быстро)

Уважаемые дамы и господа,

Спасибо за обращение в службу поддержки сертификатов. Вам нужно будет использовать промежуточный комплект сертификатов с перекрестным сертификатом и корневым сертификатом G1. Это решит эту проблему. Вы можете получить сертификаты, перечисленные ниже, по адресу https://certs.godaddy.com/repository.

Промежуточный пакет сертификатов - gdig2_bundle.crt Корневой сертификат - gd-class2-root.crt

Импорт пакета GoDaddy решает проблему:

export JAVA_HOME=/usr/lib/jvm/java-8-oracle/
wget https://certs.godaddy.com/repository/gd_bundle-g2.crt
$JAVA_HOME/bin/keytool -import -alias root -file ./gd_bundle-g2.crt -storepass changeit -trustcacerts -keystore $JAVA_HOME/jre/lib/security/cacerts

Вот что я сделал..

keytool -v -genkey -dname "CN = XXX, OU = YYY, O = ZZZ, L = CCC, ST = SSS, C = US" -alias myKey -keypass abc123 -keystore myKeystore -storepass abc123 -действительность 1096 -keyalg RSA -кейз 2048 -сигнал SHA1 с RSA

keytool -certreq -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -v -alias myKey -file mycsr.pem -keystore myKeystore -storepass abc123

Отправьте запрос (mycsr.pem) в GoDaddy, загрузите файл PEM (в данном случае 1b27b7d7a29a06.pem).

Загруженный файл PEM содержит мой подписанный сертификат вместе с другими в цепочке сертификатов. Я обнаружил, что keytool не будет принимать загруженный файл PEM. Я должен был удалить свой сертификат из загруженного сертификата. Я сделал это через Key Store Explorer ( http://keystore-explorer.sourceforge.net/). Используйте опцию "Изучить сертификат", откройте файл PEM, полученный от Godaddy (1b27b7d7a29a06.pem), нажмите на свой сертификат (не один). других из GoDaddy), нажмите "PEM", нажмите "Экспорт". Я назвал этот сертификат 1b27b7d7a29a06-mycert.pem.

Загрузите корневой (gdroot-g2.crt) и промежуточный (gdig2.crt) сертификаты с GoDaddy ( https://certs.godaddy.com/anonymous/repository.pki)

Обратите внимание, что это /one должен использовать корневой и промежуточный сертификаты GoDaddy G2.

Далее установите эти сертификаты в следующем порядке:

keytool -v -importcert -trustcacerts -keystore myKeystore -storepass abc123 -file gdroot-g2.crt -alias gdroot-g2

keytool -v -importcert -trustcacerts -keystore myKeystore -storepass abc123 -file gdig2.crt -alias gdig2

keytool -v -importcert -keystore myKeystore -storepass abc123 -alias myKey -file 1b27b7d7a29a06-mycert.pem

Теперь вы можете подписать свое приложение:

jarsigner -keystore myKeystore -storepass abc123 -sigalg SHA1withRSA -digestalg SHA-1 time.jar mykey

Я должен сказать,

вся эта подпись Java bs, кажется, является единственным методом для Java, чтобы не умирать в пользу лучших вариантов кода.

На самом деле я думаю, что это убивает Java. Я бы предпочел использовать любой другой метод кодирования (php/flash/etc) затем снова использовать Java. Way to go Oracle!

Другие вопросы по тегам