Accueil · les reçus de vote (2012) · reçus de vote (2013) · applets (2013)

Applet de vote par internet pour les législatives 2012 et certificats

Suite à l'article de HardKor Vote par internet : cryptographie avancée ? oh really ? et suite aux multiples problèmes de certificats entraînant des incompatibilités avec Java 7, j'ai tâché de regrouper quelques informations sur le sujet.

Le principe général : le logiciel utilisé sur l'ordinateur de l'électeur contient un certificat pour garantir son intégrité et son authenticité. Ce certificat est garanti par un autre qui peut être garanti par un autre etc. formant une chaîne de certificats jusqu'à une autorité de certification initiale. Pour que l'électeur puisse voter en ayant des garanties sur ces certificats, l'autorité initiale doit être connue de la version de Java utilisée, la chaîne de certificats doit être valide, les dates de validité doivent être respectées, etc.

L'applet de test

La version de test (édition du 11/06 : elle a été modifiée depuis), est fournie avec un certificat expiré et sans valeur.
[copie locale, somme de contrôle SHA256 26f313d6cdf87e33ee553d1ce9e78b4cb3371ac34ee7682a38d112c748fc9286]

Test avec jarsigner fourni avec Java 6 (détails : openjdk-6-jdk:i386 version 6b24-1.11.1-6 du paquet Debian Unstable) :


jarsigner -verify -certs -verbose voting-applet.jar
(…)
X.509, CN=duke2, OU=test, O=test, L=test, ST=test, C=es
[certificate expired on 16/09/07 16:49]
(…)
Warning:
This jar contains entries whose signer certificate has expired.

Résultat idem avec Java 7 (détails : openjdk-7-jdk:i386 version 7~u3-2.1.1~pre1-2 du paquet Debian Unstable) 

L'applet utilisée réellement pour le vote

La version de production ne semble plus accessible depuis la fermeture du scrutin 1er tour. J’ai retrouvé une copie dans l’analyse de L. Grégoire (copie locale). La chaîne de certificats est acceptée par Open JDK 6, Oracle JDK 6 et 7, mais rejetée par Open JDK 7 en l'absence du certificat GlobalSign CodeSigning G2.
[copie locale, somme de contrôle SHA256 6599ec2e599fc0016baabfb9abd378893abc111cbe6928e7b943546fde048c43].

Vérification avec OpenJDK

Test avec jarsigner fourni avec Java 6 (détails : openjdk-6-jdk:i386 version 6b24-1.11.1-6 du paquet Debian Unstable) :


jarsigner -verify -certs -verbose voting-applet.jar
(…)
X.509, CN=MINISTERE DES AFFAIRES ETRANGERES ET EUROPEENNES, OU=0002 12000601000025, O=MINISTERE DES AFFAIRES
ETRANGERES ET EUROPEENNES, L=PARIS, ST=ILE DE FRANCE, C=FR
[certificate is valid from 13/01/12 16:12 to 13/01/15 16:12]
X.509, CN=GlobalSign CodeSigning CA – G2, O=GlobalSign nv-sa, C=BE
[certificate is valid from 13/04/11 10:00 to 13/04/19 10:00]
[KeyUsage extension does not support code signing]
(…)

Test avec jarsigner fourni avec Java 7 (détails : openjdk-7-jdk:i386 version 7~u3-2.1.1~pre1-2 du paquet Debian Unstable) :


jarsigner -verify -certs -verbose voting-applet.jar
(…)
X.509, CN=MINISTERE DES AFFAIRES ETRANGERES ET EUROPEENNES, OU=0002 12000601000025, O=MINISTERE DES AFFAIRES
ETRANGERES ET EUROPEENNES, L=PARIS, ST=ILE DE FRANCE, C=FR
[certificate is valid from 13/01/12 16:12 to 13/01/15 16:12]
X.509, CN=GlobalSign CodeSigning CA - G2, O=GlobalSign nv-sa, C=BE
[certificate is valid from 13/04/11 10:00 to 13/04/19 10:00]
[CertPath not validated: null]
(…)
Warning: 
This jar contains entries whose certificate chain is not validated.

Le certificat de l'autorité de confiance GlobalSign dédié à la signature de code (CodeSigning) n'est pas disponible par défaut dans cette installation, la vérification est plus poussée avec Java 7 et la chaine de confiance ne peut être vérifiée, d'où l'avertissement.

Pour les plus curieux, ce certificat est disponible en ligne [copie locale], peut être importé et alors la vérification réussit (il faut saisir un mot de passe à 6 caractères au moins pendant l'opération).


keytool -keystore ~/.keystore --importcert -file GlobalSign_CodeSigning_G2.pem 
Enter keystore password:  
Re-enter new password: 
Owner: CN=GlobalSign CodeSigning CA - G2, O=GlobalSign nv-sa, C=BE
Issuer: CN=GlobalSign Root CA, OU=Root CA, O=GlobalSign nv-sa, C=BE
Serial number: 400000000012f4ee1355c
Valid from: Wed Apr 13 10:00:00 GMT 2011 until: Sat Apr 13 10:00:00 GMT 2019
(…)
Trust this certificate? [no]:  yes
Certificate was added to keystore

jarsigner -keystore ~/.keystore -verify -certs -verbose prod-voting-applet.jar
(…)
X.509, CN=MINISTERE DES AFFAIRES ETRANGERES ET EUROPEENNES, OU=0002 12000601000025, O=MINISTERE DES AFFAIRES
ETRANGERES ET EUROPEENNES, L=PARIS, ST=ILE DE FRANCE, C=FR
[certificate is valid from 1/13/12 4:12 PM to 1/13/15 4:12 PM]
X.509, CN=GlobalSign CodeSigning CA - G2, O=GlobalSign nv-sa, C=BE (mykey)
[certificate is valid from 4/13/11 10:00 AM to 4/13/19 10:00 AM]
(…)
jar verified.

Vérification avec Oracle JDK

La vérification passe de base avec un Oracle jdk1.6.0_32 (qui ne semble pas vérifier la chaîne de certificats) :


X.509, CN=MINISTERE DES AFFAIRES ETRANGERES ET EUROPEENNES, OU=0002 12000601000025, O=MINISTERE DES AFFAIRES
ETRANGERES ET EUROPEENNES, L=PARIS, ST=ILE DE FRANCE, C=FR
[certificate is valid from 13/01/12 16:12 to 13/01/15 16:12]
X.509, CN=GlobalSign CodeSigning CA - G2, O=GlobalSign nv-sa, C=BE
[certificate is valid from 13/04/11 10:00 to 13/04/19 10:00]
[KeyUsage extension does not support code signing]
(…)
jar verified.

La vérification passe de base avec un Oracle jdk1.7.0_04 (qui pourtant ne semble pas être livré avec le certificat CodeSigning G2) :


X.509, CN=MINISTERE DES AFFAIRES ETRANGERES ET EUROPEENNES, OU=0002 12000601000025, O=MINISTERE DES AFFAIRES
ETRANGERES ET EUROPEENNES, L=PARIS, ST=ILE DE FRANCE, C=FR
[certificate is valid from 13/01/12 16:12 to 13/01/15 16:12]
X.509, CN=GlobalSign CodeSigning CA - G2, O=GlobalSign nv-sa, C=BE
[certificate is valid from 13/04/11 10:00 to 13/04/19 10:00]
(…)
jar verified.

Autre version de l'applet de test

Une autre version de l'applet de test est disponible dans l'article de HardKor mis en ligne le 3 mai qui référence une archive [copie locale).
[copie locale, somme de contrôle SHA256 d8c4b7f64c2726ca5db146772ea85ce575e0392aa43f72b822ccb3388abc6ed3]

Test avec jarsigner fourni avec Java 6 (détails : openjdk-6-jdk:i386 version 6b24-1.11.1-6 du paquet Debian Unstable) :


jarsigner -verify -certs -verbose voting-applet.jar
(…)
X.509, CN=duke2, OU=test, O=test, L=test, ST=test, C=es
[certificate expired on 16/09/07 16:49]
(…)
Warning: 
This jar contains entries whose signer certificate has expired. 

Test avec jarsigner fourni avec Java 7 (détails : openjdk-7-jdk:i386 version 7~u3-2.1.1~pre1-2 du paquet Debian Unstable) :


jarsigner -verify -certs -verbose voting-applet.jar
(…)
X.509, CN=duke2, OU=test, O=test, L=test, ST=test, C=es
[certificate expired on 16/09/07 16:49]
[CertPath not validated: null]
(…)
Warning: 
This jar contains entries whose signer certificate has expired. 
This jar contains entries whose certificate chain is not validated.

Et encore une autre version de l'applet de test

Une troisième version de l'applet de test m'a été signalée par courriel par Xavier, disponible sur le site officiel.
[copie locale, somme de contrôle SHA256 e24e2fbcf48fa87cfdefdab1f6b94489ceb9e4954d8ed39c0326726803656d00]

Comparaison des différentes versions de l'applet

Version Prod Test Test2 Test3
Taille en octets 799877 798247 953002 798247
Sha256sum 6599ec2e... d8c4b7f6... 26f313d6... e24e2fbc...
JDK utilisé d'après le MANIFEST.MF 19.1-b02 (Sun Microsystems Inc.) 16.3-b01 (Sun Microsystems Inc.) 16.3-b01 (Sun Microsystems Inc.) 16.3-b01 (Sun Microsystems Inc.)
Différences en terme de fichiers Version de référence Certificats de tests DUKE2 (META-INF/DUKE2.DSA, META-INF/DUKE2.SF) au lieu de ceux du Ministère des Affaires Étrangères et Européennes (MAEE) (META-INF/MAEE.RSA, META-INF/MAEE.SF) 132 fichiers en plus (images utilisés pour le vote prudhomales avec le Ministère de l'Éducation Nationale (MEN) et des fichiers tirés de Apache Commons Codec sous licence Apache Identique à la version « test » (avec des fichiers datés du 8 juin au lieu du 23 mai)
Différences en contenu de fichiers Version de référence Certificats servers pnyx.application.pem, auth.server.pem, message.server.pem
Configurations maee-advanced.xml et propertiesCertificateParsers.xml qui précisent le statut de test
Configuration MAEE erronée qui parle encore du MEN (maee_fr.properties).
Classe com.scytl.voting.applet.view.swing.SwingConfirmVote différente
Identique à la version « test » sauf le fichier de signature DUKE2.DSA

Remerciements

Merci à Bastien Durel qui le premier a vérifié les certificats de l'applet, qui indirectement m'a incité à écrire cette page et qui m'a fourni les infos utiles.

Merci à HardKor et Paul Da Silva pour leurs entrées de blogs sur ces applets.

Merci à Xavier pour l'applet de test n°3.

Accueil · les reçus de vote (2012) · reçus de vote (2013) · applets (2013)

Dernière mise à jour : 2012/06/11

Ce document est placé sous licence Creative Commons by-sa.

Pour me contacter ou avoir des informations, envoyez-moi un message à oumph@free.fr.