it-roy-ru.com

Подписание файла JAR с доверенным сертификатом для развертывания JWS

Я разработал программу с открытым исходным кодом, WPCleaner, которая распространяется через Java Web Start. Текущая версия доступна на http://site4145.mutu.sivit.org/WikiCleaner/WikiCleaner.jnlp

С недавними обновлениями в Java становится все труднее развертывать приложения Java через Java Web Start, когда вам нужно, чтобы у приложения было несколько разрешений (запись в настройках, доступ к другим веб-сайтам, ...)

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

Я получил один из Certum (очевидно, они бесплатны для разработчиков с открытым исходным кодом), после этого обсуждения: Сертификат подписи кода для проектов с открытым исходным кодом?

Я создал новый файл JAR, подписанный этим сертификатом (файл JAR доступен по адресу http://site4145.mutu.sivit.org/WikiCleaner/WikipediaCleanerTest.jar ), но у меня все еще есть проблемы: при запуске приложение через JWS, Java по-прежнему отображает предупреждающие окна, не позволяя мне раз и навсегда доверять приложению. Редактор по-прежнему отображается как UNKNOWN, но когда я просматриваю подробности сообщения, используется мой новый сертификат от Centrum.

Кто-нибудь имеет представление о том, что я делаю неправильно? Я думал, что наличие сертификата от доверенного центра сертификации (кажется, что Centrum находится в Java cacerts) позволит пользователям принять сертификат раз и навсегда.

Спасибо

PS: когда я запускаю jarsigner -verify, я получаю следующее предупреждение «Этот jar-файл содержит записи, цепочка сертификатов которых не проверена».

17
NicoV

Я думаю, что мне наконец удалось сделать это после этой процедуры:

  • Установлен сертификат, предоставленный Certum в Chrome через интерфейс их веб-сайта
  • Экспортировал закрытый ключ как .pfx из Chrome (Настройки, Управление сертификатами, Экспорт, Экспортировать закрытый ключ, PKCS # 12, ...)
  • Использовал KeyTool GUI (графический интерфейс Java для keytools) для создания полного p12: импортированный корневой сертификат Certum в качестве доверенного сертификата, импортированные промежуточные сертификаты в качестве доверенных сертификатов, импортированный my .pfx в качестве пары ключей
  • Подписал банку с этим p12

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

Правка: я снова попытался экспортировать сертификат из Chrome, и я увидел, что есть возможность включить цепочку сертификатов в экспорт. При этом мне даже не нужно использовать графический интерфейс KeyTool впоследствии. Я повторно развернул тестовую версию, подписанную этим новым p12:

  • Установлен сертификат, предоставленный Certum в Chrome через интерфейс их веб-сайта
  • Экспортировал закрытый ключ как .pfx из Chrome (Настройки, Управление сертификатами, Экспорт, Экспорт закрытого ключа, PKCS # 12 + включает цепочку сертификатов, ...)
  • Подписал банку с этим p12
6
NicoV

[Обновление 2017] При подписании открытого исходного кода от Certum теперь используется криптографическая флэш-карта в качестве закрытого ключа, и ее необходимо подключить для активации и установки сертификата, а также для подписи кода. Ключ стоит 125 $ (+ стоимость доставки), а годовой сертификат стоит 40 $. Вы можете попросить скидку.


Вот следующие шаги, чтобы подписать файл JAR с нуля.

Инструкции

Инструкции на английском языке трудно найти и они не актуальны. Следующая процедура основана на этих 2 документах:

Создать, активировать и установить свой сертификат:

  1. Перейдите на веб-сайт «Certum Certification» в разделе «Подписание кода OpenSource» и закажите свой сертификат.
  2. После получения криптографической флеш-карты (у меня это заняло 15 дней), подключите ее, установите драйвер и программное обеспечение proCertum CardManager с карты.
  3. Перейдите в свою учетную запись Certum и выполните процесс активации недавно заказанного сертификата.

Совет: Приложение CryptoAgent Java Web Start запускается только с JDK (не JRE) <9 (то есть JDK 7 или 8).

  1. Вы получите письмо с просьбой предоставить некоторые официальные документы (удостоверение личности, счет за аренду и т.д.) И процедуру проверки по электронной почте.
  2. Отправьте для активации необходимые документы и информацию. Вы получите еще одно письмо с просьбой установить сертификат (проверка была произведена в течение 1 часа).
  3. Установите сертификат на криптографическую карту, следуя процедуре Хранение сертификата на карте _ (см. Инструкции на английском языке, часть 4)

Получить файл "bundle.pem"

Этот файл является обязательным для получения действительной цепочки сертификатов при подписании вашего заявления (см. Часть 7.1.2 в инструкциях на польском языке).

По сути, он состоит из объединения в текстовом файле формата 1) вашего сертификата и 2) открытого ключа Certum Code Signing CA SHA2.

  1. Откройте proCertum CardManager >> Чтение карты >> вкладку Общее >> Выберите свой сертификат и нажмите «Показать подробности»
  2. Экспортируйте ваш сертификат: x509 - base-64
  3. Загрузите Certum Code Signing CA SHA2 в формате PEM (из списка корневых сертификатов из Certum).
  4. Создайте текстовый файл «bundle.pem», объединив эти 2 сертификата (сначала ваш сертификат, а затем сертификат Certum).

Подпишите свой файл jar с Jarsigner

  1. Создайте файл "provider.cfg", как описано в пункте 7.2 инструкций на английском языке.
  2. Вам нужен alias вашего сертификата (а не имя владельца), чтобы подписать ваш jar. Для его получения выполните следующую команду:
keytool -list -v -keystore NONE -storetype PKCS11 -providerClass Sun.security.pkcs11.SunPKCS11 -providerArg "provider.cfg" -storepass "[your_pin]"
  1. Как только вы подготовите файлы alias, provider.cfg и bundle.pem, просто подпишите свой jar с помощью следующей команды:
jarsigner -keystore NONE -certchain "bundle.pem" -tsa "http://time.certum.pl" -storetype PKCS11 -providerClass Sun.security.pkcs11.SunPKCS11 -providerArg "provider.cfg" -storepass "[your_pin]" "[your_code].jar" "[your_alias]"

Лично я использую скрипт Ant для подписи файлов jar приложения. Смотрите подписать задачу из проекта ANT.

10
Eric David

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

На основании JaNeLA для файла - действительный JNLP. Наиболее важно известный издатель для WikiCleanerTest .. 

enter image description here

Таким образом, есть один результат «похоже, здесь работает для идентификации издателя». Отличная работа и спасибо за описание процесса.

Работает намного лучше, чем тот, на который я смотрел раньше. :П


Jarsigner -verify

s     292828 Sun Oct 20 17:57:58 EST 2013 META-INF/MANIFEST.MF
      292645 Sun Oct 20 17:57:58 EST 2013 META-INF/WPCLEANE.SF
        2017 Sun Oct 20 17:57:58 EST 2013 META-INF/WPCLEANE.RSA
           0 Sun Oct 20 17:57:52 EST 2013 META-INF/
           0 Wed Feb 11 15:04:50 EST 2009 META-INF/maven/
           ..
           0 Sun Oct 20 17:57:32 EST 2013 org/xnap/commons/i18n/
sm      2837 Thu Sep 09 16:00:54 EST 2004 META-INF/info.xml
..
sm       214 Wed Feb 11 00:57:02 EST 2009 org/xnap/commons/i18n/LocaleChangeListener.class

  s = signature was verified 
  m = entry is listed in manifest
  k = at least one certificate was found in keystore
  i = at least one certificate was found in identity scope

jar verified.

Warning: 
This jar contains entries whose certificate chain is not validated.

Re-run with the -verbose and -certs options for more details.

Я понимаю предупреждение:

Этот файл содержит записи, цепочка сертификатов которых не проверена.

..может быть проигнорировано.

JaNeLA Доклад

JaNeLA показывает одну ошибку.

JaNeLA Report - version 11.05.17

Report for http://site4145.mutu.sivit.org/WikiCleaner/WikiCleaner.jnlp

cvc-complex-type.2.4.a: Invalid content was found starting with element 'homepage'. One of '{description, icon, offline-allowed, shortcut, association, related-content}' is expected.
cvc-complex-type.2.4.a: Invalid content was found starting with element 'homepage'. One of '{description, icon, offline-allowed, shortcut, association, related-content}' is expected.

XML encoding not known, but declared as utf-8
Codebase + href 'http://site4145.mutu.sivit.org/WikiCleaner.jnlp' is not equal to actual location of 'http://site4145.mutu.sivit.org/WikiCleaner/WikiCleaner.jnlp'.
Desktop icons were subject to bug nnnn in earlier J2SE versions
Optimize this application for off-line use by adding the <offline-allowed /> flag.
'short' description is longer than 'default' description.
Downloads can be optimized by specifying a resource size for 'WikipediaCleaner.jar'.
The resource download at WikipediaCleaner.jar can be optimized by removing the (default) value of download='eager'.
Lazy downloads might not work as expected for WikipediaCleaner.jar unless the download 'part' is specified. 
Resource type png of resource commons-nuvola-web-broom.png is not one of the allowable types of gif, jpg, jpeg.
Downloads can be optimized by specifying a resource size for 'commons-nuvola-web-broom.png'.
Icon loading & use can be optimized by specifying the width and height for commons-nuvola-web-broom.png

См. JNLP, проверенную и исправленную версию с твиком, ниже.

Запуск

Но вот настоящие плохие новости:

UNKNOWN publisherUNKNOWN publisher - More Info.

Вот некоторые детали сертификата:

  • Николя Вервелле (Nicolas Vervelle)

    • Тема: CN = Николас Вервелл, OU = WikipediaCleaner, O = WikipediaCleaner, L = Париж, ST = Франция, C = FR

Устаревшая Java

Вот странное предупреждение, я не понимаю ..

Out Of Date Java

Приложение. запрашивает 1.5.0+, поэтому любая версия 1.7+ должна быть принята без вопросов.
Он утверждает, что запрашивает 1.6 (возможно, потому что у меня не установлено 1.5 во время выполнения). Единственное, что я могу подумать, это активировать предупреждение, это включение микро-версии, которая не нужна.

JNLP

Вот JNLP, подтвержденный выше:

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.5+" codebase="http://site4145.mutu.sivit.org/WikiCleaner" href="WikiCleaner.jnlp">
  <information>
    <title>WPCleaner</title>
    <vendor>User:NicoV</vendor>
    <description>WPCleaner</description>
    <description kind="short">A tool for Wikipedia maintenance</description>
    <homepage href="http://en.wikipedia.org/wiki/WP:WPCleaner"/>
    <icon href="commons-nuvola-web-broom.png"/>
    <shortcut>
      <desktop/>
    </shortcut>
  </information>
  <security>
    <all-permissions/>
  </security>
  <resources>
    <j2se version="1.5.0+" Java-vm-args="-Xmx512M"/>
    <jar href="WikipediaCleaner.jar" download="eager" main="true"/>
  </resources>
  <application-desc main-class="org.wikipediacleaner.WikipediaCleaner"/>
</jnlp>

Вот предложенная замена. Он действителен в соответствии с JaNeLA (предупреждения о барах, которые мы можем игнорировать). Он также включает в себя еще один твик к атрибуту минимальной версии.

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.5+" codebase="http://site4145.mutu.sivit.org/WikiCleaner" href="WikiCleaner.jnlp">
  <information>
    <title>WPCleaner</title>
    <vendor>User:NicoV</vendor>
    <!-- Should be here.. -->
    <homepage href="http://en.wikipedia.org/wiki/WP:WPCleaner"/>
    <description>WPCleaner</description>
    <description kind="short">A tool for Wikipedia maintenance</description>
    <icon href="commons-nuvola-web-broom.png"/>
    <shortcut>
      <desktop/>
    </shortcut>
  </information>
  <security>
    <all-permissions/>
  </security>
  <resources>
    <!-- the micro-version request might be triggering the 
    Out-Of-Date Java version warning -->
    <j2se version="1.5+" Java-vm-args="-Xmx512M"/>
    <jar href="WikipediaCleaner.jar" download="eager" main="true"/>
  </resources>
  <application-desc main-class="org.wikipediacleaner.WikipediaCleaner"/>
</jnlp>
3
Andrew Thompson

В Linux у меня сработала следующая процедура. Это основано на ответе Эрика Дэвида.

Получите ваш сертификат

Перейдите на веб-сайт Certum Certification в разделе «Подписывание кода OpenSource». Купите сертификат и выполните процедуру создания.

Получить открытый ключ для подписи кода

Получить Открытый ключ подписи кода Certum CA , возможно, ключ CA SHA2 cscasha2.cer .

Преобразовать сертификат в формат pkcs12

  • Импортируйте свой собственный сертификат (тот, который вы получили от Certum) в Firefox: 
    пункт меню настроек - расширенный - сертификаты - показать сертификаты.
  • Импортируйте ключ пользователя CA SHA2 (используется Certum для подписи вашего сертификата): 
    Сертификат вкладки. органы власти - импорт.
  • Проверьте. Следует сказать, что это было проверено: 
    Вкладка собственные сертификаты - покажи.
  • Экспорт сертификата: 
    вкладка собственные сертификаты - сохранить - как pkcs12 (например, в mycert.p12)

Преобразовать из формата pkcs12 в формат jks

Найдите псевдоним, используемый в вашем файле pkcs12. Это будет похоже на "unizeto technologies s.a. id von open source developer, ВАШЕ ИМЯ".

keytool -list -v -storetype pkcs12 -keystore mycert.p12 > out.txt
grep Aliasname out.txt

Затем преобразуйте файл pkcs12 в формат jks для Java. Этот шаг можно было бы пропустить, но как только он будет выполнен, это удобно.

keytool -importkeystore -srckeystore mycert.p12 -srcstoretype pkcs12 -srcalias "ALIASNAME" -destkeystore mycert.jks -deststoretype jks -deststorepass PASSWORD -destalias SHORTALIAS

Подпишите свой файл jar

Чтобы избежать предупреждений для пользователя веб-запуска, файл манифеста jar должен содержать следующие атрибуты:

  • Имя приложения: APPNAME
  • Разрешения: все-разрешения
  • Кодовая база: URL
  • Application-Library-Allowable-Codebase: URL

Подпишите ваш файл jar, используя следующую команду:

jarsigner -keystore mycert.jks -tsa http://time.certum.pl FILENAME.jar SHORTALIAS
2
qwert2003

Я решил ту же проблему на моем сегодня с этим:

Manifest-Version: 1.0
Trusted-Library: true
Application-Library-Allowable-Codebase: *
Trusted-Only: false
Application-Name: My app
Permissions: all-permissions
Created-By: 1.6.0_16 (Sun Microsystems Inc.)
Caller-Allowable-Codebase: *
Codebase: *
0
Pignic

Как уже упоминалось здесь , чтобы удалить предупреждение НЕИЗВЕСТНОГО ИЗДАТЕЛЯ, вы можете добавить сертификат, который вы использовали для подписи jar, в JAR подписавшего панели управления Java: Настройка Java -> Безопасность -> Управление сертификатами -> Опция Signer Jar - > Импорт.

0
FHeNuS