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."
Je pense que j'ai finalement réussi à le faire en suivant cette procédure:
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:
[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:
Astuce: L'application CryptoAgent Java Web Start ne s'exécute qu'avec un JDK (et non JRE) <9 (donc, JDK 7 ou 8).
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.
Signer votre fichier jar avec Jarsigner
keytool -list -v -keystore NONE -storetype PKCS11 -providerClass Sun.security.pkcs11.SunPKCS11 -providerArg "provider.cfg" -storepass "[your_pin]"
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.
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 ..
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
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é.
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.
Mais voici la vraie mauvaise nouvelle:
Voici quelques détails du certificat:
Nicolas Vervelle (Nicolas Vervelle)
Voici un avertissement étrange que je ne comprends pas.
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.
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>
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
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:
Signez votre fichier jar en utilisant la commande suivante:
jarsigner -keystore mycert.jks -tsa http://time.certum.pl FILENAME.jar SHORTALIAS
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: *
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.