web-dev-qa-db-fra.com

Signature d'un fichier JAR avec un certificat de confiance pour le déploiement de JWS

J'ai développé un programme open source, WPCleaner, distribué via Java Web Start. La version actuelle est disponible sur http://site4145.mutu.sivit.org/WikiCleaner/WikiCleaner.jnlp

Avec les mises à jour récentes en Java, il est de plus en plus difficile de déployer des applications Java via Java Web Start lorsque l'application doit disposer de quelques autorisations (écriture dans les préférences, accès à d'autres sites Web, ...).

Mon application était auto-signée, ce qui était acceptable auparavant, mais les nouvelles mises à jour exigent que les utilisateurs l'acceptent à chaque fois qu'ils l'exécutent, pas seulement une fois pour toutes s'ils le souhaitent. J'ai donc décidé d'utiliser un certificat de confiance pour signer mon application.

J'en ai reçu un de Certum (apparemment, ils sont gratuits pour les développeurs open source), suite à cette discussion: Certificat de signature de code pour les projets open source?

J'ai généré un nouveau fichier JAR, signé avec ce certificat (fichier JAR disponible à http://site4145.mutu.sivit.org/WikiCleaner/WikipediaCleanerTest.jar ), mais j'ai toujours des problèmes: quand je démarre l'application via JWS, Java affiche toujours une fenêtre d'avertissement ne me permettant pas de faire confiance à l'application une fois pour toutes. L'éditeur est toujours affiché en tant qu'inconnu, mais lorsque je regarde dans les détails du message, c'est mon nouveau certificat de Centrum qui est utilisé.

Quelqu'un at-il une idée de ce que je fais de mal? Je pensais qu’avoir un certificat d’une autorité de certification de confiance (Centrum semble être en Java cacerts) permettrait aux utilisateurs d’accepter le certificat une fois pour toutes.

Merci

PS: lors de l'exécution de jarsigner -verify, le message d'avertissement suivant s'affiche: "Ce fichier JAR contient des entrées dont la chaîne de certificats n'est pas validée."

17
NicoV

Je pense que j'ai finalement réussi à le faire en suivant cette procédure:

  • Installé le certificat fourni par Certum dans Chrome via l'interface de leur site Web
  • Exporté la clé privée sous forme de fichier .pfx à partir de Chrome (paramètres, gestion des certificats, exportation, exportation de la clé privée, PKCS # 12, ...)
  • Utilisation de l'interface graphique KeyTool (interface graphique Java pour Keytools) pour créer une p12 complète: certificat racine Certum importé en tant que certificat de confiance, certificats intermédiaires importés en tant que certificats de confiance, importé mon fichier .pfx en tant que paire de clés
  • Signé le pot avec cette p12

Cela semble fonctionner pour moi, j'attends les commentaires des autres utilisateurs pour être sûr que cela fonctionne également pour eux.

Modifier: j'ai essayé à nouveau d'exporter le certificat à partir de Chrome et j'ai vu qu'il existe une option pour inclure la chaîne de certificats dans l'exportation. Ce faisant, je n'ai même pas besoin d'utiliser l'interface graphique KeyTool par la suite. J'ai redéployé la version test signée avec cette nouvelle p12:

  • Installé le certificat fourni par Certum dans Chrome via l'interface de leur site Web
  • Exporté la clé privée sous forme de fichier .pfx à partir de Chrome (paramètres, gestion des certificats, exportation, exportation de la clé privée, chaîne de certificats PKCS # 12 + include, ...)
  • Signé le pot avec cette p12
6
NicoV

[Mise à jour 2017] La signature de code Open Source de Certum utilise désormais une carte flash cryptographique en tant que clé privée et doit être connectée pour l'activation et l'installation du certificat, ainsi que pour la signature de code. La clé coûte 125 $ (+ frais d'expédition) et le certificat d'un an coûte 40 $. Vous pouvez demander un rabais.


Voici les étapes suivantes pour signer votre fichier JAR à partir de zéro.

Instructions

Les instructions en anglais sont difficiles à trouver et ne sont pas à jour. La procédure suivante est basée sur ces 2 documents:

Créez, activez et installez votre certificat:

  1. Allez sur le site Web "Certum Certification" dans la section "Signature de code OpenSource" et commandez votre certificat.
  2. Une fois la carte flash cryptographique reçue (cela m'a pris 15 jours), branchez-la, installez le pilote et le logiciel proCertum CardManager de la carte.
  3. Accédez à votre compte Certum et suivez le processus d'activation de votre nouveau certificat commandé.

Astuce: L'application CryptoAgent Java Web Start ne s'exécute qu'avec un JDK (et non JRE) <9 (donc, JDK 7 ou 8).

  1. Vous recevrez un courrier demandant des documents officiels (carte d'identité, facture de loyer, etc.) et une procédure de vérification par courrier électronique.
  2. Envoyez les documents et les informations d'activation requis. Vous recevrez un autre courrier vous demandant d'installer le certificat (la vérification a été effectuée dans l'heure).
  3. Installez le certificat sur la carte cryptographique en suivant la procédure Stocker le certificat sur la carte (voir les instructions en anglais, partie 4)

Obtenir le fichier "bundle.pem"

Ce fichier est obligatoire pour obtenir une chaîne de certificats valide lors de la signature de votre application (voir la partie 7.1.2 des instructions en polonais).

Il consiste essentiellement à concaténer dans un fichier au format texte brut 1) votre certificat et 2) la clé publique Certum Code Signing CA SHA2.

  1. Ouvrez proCertum CardManager >> Lecture de la carte >> onglet Commun >> Sélectionnez votre certificat et cliquez sur "Afficher les détails".
  2. Exportez votre certificat: x509 - base-64
  3. Téléchargez le Certum Code Signing CA SHA2 au format PEM (à partir de la liste des certificats racine de Certum).
  4. Créez le fichier texte "bundle.pem" en concaténant ces 2 certificats (d'abord votre certificat et ensuite le certificat Certum).

Signer votre fichier jar avec Jarsigner

  1. Créez le fichier "provider.cfg" comme expliqué au point 7.2 des instructions en anglais.
  2. Vous avez besoin du alias de votre certificat (et non du nom du propriétaire) pour signer votre pot. Pour l'obtenir, exécutez la commande suivante:
keytool -list -v -keystore NONE -storetype PKCS11 -providerClass Sun.security.pkcs11.SunPKCS11 -providerArg "provider.cfg" -storepass "[your_pin]"
  1. Une fois que vous avez prêt les fichiers alias, fournisseur.cfg et bundle.pem, il vous suffit de signer votre fichier jar avec la commande suivante:
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]"

Personnellement, j’utilise un script Ant pour signer mes fichiers JAR d’application. Voir tâche signjar du projet ANT.

10
Eric David

J'attends les commentaires des autres utilisateurs pour m'assurer que cela fonctionne également pour eux.

Basé sur JaNeLA pour le fichier - JNLP valide. Plus important encore éditeur connu pour WikiCleanerTest .. 

enter image description here

Il y a donc un résultat de «semble fonctionner ici pour identifier l'éditeur». Excellent travail et merci pour la description du processus.

Fonctionne tellement mieux que celui que j'ai déjà vu. : P


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.

Je comprends l'avertissement:

Ce fichier JAR contient des entrées dont la chaîne de certificats n'est pas validée.

..peut être ignoré.

Rapport JaNeLA

JaNeLA affiche une erreur.

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

Voir le JNLP validé, et une version corrigée avec Tweak, ci-dessous.

Lancement

Mais voici la vraie mauvaise nouvelle:

UNKNOWN publisherUNKNOWN publisher - More Info.

Voici quelques détails du certificat:

  • Nicolas Vervelle (Nicolas Vervelle)

    • Sujet: CN = Nicolas Vervelle, OU = WikipediaCleaner, O = WikipediaCleaner, L = Paris, ST = France, C = FR

Java périmé

Voici un avertissement étrange que je ne comprends pas.

Out Of Date Java

L'application. demande 1.5.0+ donc toute version 1.7+ devrait être acceptée sans poser de question.
Il prétend demander 1.6 (probablement parce que je n’ai pas installé 1.5 au moment de l’exécution). La seule chose que je peux penser qui déclenche l'avertissement est l'inclusion d'une micro-version, qui est inutile.

JNLP

Voici le JNLP validé ci-dessus:

<?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>

Voici un remplacement suggéré. Il est valable selon JaNeLA (sauf les avertissements que nous pouvons ignorer). Il inclut également un autre Tweak à l'attribut version minimale.

<?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

Sous Linux, la procédure suivante a fonctionné pour moi. Il est basé sur la réponse d'Eric David.

Obtenez votre certificat

Rendez-vous sur le site Web "Certum Certification" dans la section "Signature de code OpenSource". Achetez un certificat et suivez la procédure de création.

Obtenir la clé publique pour la signature de code

Obtenez la clé publique de Certum Code Signing CA , probablement la clé CA SHA2 cscasha2.cer .

Convertir le certificat au format pkcs12

  • Importez votre propre certificat (celui que vous avez obtenu de Certum) dans Firefox: 
    paramètres des éléments de menu - avancé - certificats - afficher les certificats.
  • Importez la clé publique CA SHA2 (utilisée par Certum pour signer votre certificat): 
    onglet cert. autorités - importation.
  • Vérifier. Il faut dire que cela a été vérifié: 
    onglet propres certificats - montrer.
  • Exporter le certificat: 
    onglet propres certificats - sauvegarder - en tant que pkcs12 (par exemple vers mycert.p12)

Convertir du format pkcs12 au format jks

Trouvez l'alias utilisé dans votre fichier pkcs12. Ce sera similaire à "unizeto technologies sur id de développeur open source, VOTRE NOM".

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

Convertissez ensuite le fichier pkcs12 au format jks de Java. Cette étape pourrait être omise, mais une fois cela fait, c'est pratique.

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

Signer votre fichier jar

Pour éviter les avertissements à l'utilisateur Webstart, le fichier manifeste jar doit contenir les attributs suivants:

  • Nom de l'application: APPNAME
  • Autorisations: toutes autorisations
  • Base de code: URL
  • Application-Library-Allowable-Codebase: URL

Signez votre fichier jar en utilisant la commande suivante:

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

J'ai résolu le même problème sur le mien aujourd'hui avec ceci:

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

Comme mentionné ici , pour supprimer l'avertissement de l'éditeur inconnu, vous pouvez ajouter le certificat que vous avez utilisé pour signer le fichier jar dans le Signer Jar du panneau de configuration de Java: Configurer Java -> Sécurité -> Gérer les certificats -> Option Signer Jar - > Importer.

0
FHeNuS