Avril 2011
| Revision History | |
|---|---|
| 0.1 Création | |
| 0.2 Rajout de la section pour obtenir les JAR nécessaire au WebServices | |
| 0.3 Rajout de la section version de production | |
Table of Contents
Ce document décrit l'installation et l'utilsation de l'application SignServer. SignServer est une application édité par la société suédoise PrimeKey, spécialisé dans les logiciels de sécurité, il est publié sous license LGPL, et peut donc être utilisé dans un contexte commercial.
La version utilisé dans ce document est la version trunk.
Dans sa version 3.1, SignServer nécessite les éléments suivants :
le client subversion ;
le serveur d'application JBoss, dans sa version 4.2.3 (aucune autre version de JBoss n'est supportée en date de rédaction du présent document) ;
une base de données MySQL, en version 5 (aucun autre SGBD n'est actuellement supporté) ;
le connecteur JDBC MySQL dans sa version 5.
Récuperer le trunk en utilisant la commande suivante : svn co https://signserver.svn.sourceforge.net/svnroot/signserver/trunk/signserver
Se connecter en root sur le serveur MySQL, et créer un utilisateur avec une base de donnée spécifique :
mysql> create database signserver; mysql> grant all privileges on signserver.* to signserver@'localhost' identified by 'signserver';
Extraire l'archive JBoss 4.2.x, puis définir les variaobles d'environnement suivantes :
APPSRV_HOME vers le répertoire d'extraction de JBOSS ;
ANT_HOME vers le répertoire d'extraction de l'archive Ant ;
SIGNSERVER_NODEID avec la valeur 1.
Créer le fichier signserver_build.properties
à partir du fichier
signserver_build.properties.sample, puis éditer ce
fichier, voici un exemple de fichier complet :
appserver.type=jboss
appserver.home=${env.APPSRV_HOME}
j2ee.web-nohttps=true
database.name=mysql
database.url=jdbc:mysql://127.0.0.1:3306/signserver
database.driver=com.mysql.jdbc.Driver
database.username=signserver
database.password=signserver
signingandvalidationapi.enabled=true
Compiler SignServer à l'aide des commandes suivantes :
$ANT_HOME/bin/ant clean ;
$ANT_HOME/bin/ant deploy ;
Copier le driver JDBC MySQL dans le répertoire $JBOSS_HOME/server/default/lib
Procéder au démarrage de JBoss en rajoutant l'option -b 0.0.0.0 et vérifier qu'il n'y a pas d'erreur.
Exécuter la commandes suivante :
./bin/signserver.sh module add dist-server/pdfsigner.mar demo
Le mot clé demo correspond à un fichier de configuration contenant
des propriétées par défaut. Ces fichiers sont visibles dans le
répertoire src/conf des sources du module
correspondant.
Faire la demande de signature de certificat avec la commande suivante :
Exécuter les commandes suivantes :
./bin/signserver.sh generatecertreq 1 'CN=Digital Signature,OU=OpenCSI,C=FR' "SHA256WithRSA" /tmp/certreq.pem
Le fichier /tmp/signserver00.pem contient une
demande de certificat (CSR) qu'il faut signer à l'aider de votre PKI.
Une fois le certificat obtenu, il convient de le téléverser vers
SignServer à l'aide des commantes suivantes :
./bin/signserver.sh uploadsignercertificate 1 GLOB /tmp/signserver00.pem ./bin/signserver.sh uploadsignercertificatechain 1 GLOB /tmp/OpenCSIROOTCA.pem ./bin/signserver.sh reload 1
Procéder de la même manière qu'avec le module PDF mais en chargeant
le module dist-server/tsa.mar toujours en utilisant
les propriétés demo. N'oubliez pas d'injecter le certificat
signataire, puis de rechargher le module. Pour vérifier le bon
fonctionnement du module, exécuter les commandes suivantes (appuyer sur
Control-C pour sortir) :
cd dist-client/timestampclient/ java -jar timeStampClient.jar 'http://localhost:8080/signserver/process?workerName=TSA' INFO Got reply after 441 ms INFO TimeStampRequest validated INFO Got reply after 34 ms INFO TimeStampRequest validated
Pour une version de production de SignServer, il est nécessaire de disposer de fichiers PKCS#12 contenant les certificats (et clés privées correspondantes) signataires pour chaque module. Puis créer les fichiers de configurations suivants :
GLOB.WORKERGENID1.CLASSPATH = org.signserver.module.pdfsigner.PDFSigner GLOB.WORKERGENID1.SIGNERTOKEN.CLASSPATH = org.signserver.server.cryptotokens.P12CryptoToken WORKERGENID1.NAME=PDFSigner WORKERGENID1.AUTHTYPE=NOAUTH WORKERGENID1.REASON=Document signe par OpenCSI WORKERGENID1.LOCATION=Paris WORKERGENID1.ADD_VISIBLE_SIGNATURE = False #WORKERGENID1.VISIBLE_SIGNATURE_PAGE = First #WORKERGENID1.VISIBLE_SIGNATURE_CUSTOM_IMAGE_PATH=/home/openam/etc/signserver/logo.jpg WORKER1.KEYSTOREPATH=/home/openam/etc/keystores/signserver00.p12 WORKER1.KEYSTOREPASSWORD=foo123
N'oubliez pas de modifier les propertiés WORKER1.KEYSTOREPATH et WORKER1.KEYSTOREPASSWORD avec les bonnes valeurs. Si vous souhaitez rendre la signature visible, modifier la propriété WORKERGENID1.ADD_VISIBLE_SIGNATURE à True et décommentez la propriétés WORKERGENID1.VISIBLE_SIGNATURE_PAGE, et le cas échéant définir le chemin d'un logo avec la propriété WORKERGENID1.VISIBLE_SIGNATURE_CUSTOM_IMAGE_PATH.
GLOB.WORKERGENID1.CLASSPATH = org.signserver.module.tsa.TimeStampSigner GLOB.WORKERGENID1.SIGNERTOKEN.CLASSPATH = org.signserver.server.cryptotokens.P12CryptoToken WORKERGENID1.NAME=TSA WORKERGENID1.AUTHTYPE=NOAUTH WORKERGENID1.DEFAULTTSAPOLICYOID=1.2.3 WORKERGENID1.KEYSTOREPATH=/home/openam/etc/keystores/signserver01.p12 WORKERGENID1.KEYSTOREPASSWORD=foo123
N'oubliez pas de modifier les propertiés WORKER1.KEYSTOREPATH et WORKER1.KEYSTOREPASSWORD avec les bonnes valeurs.
Avant de charger les modules, vous devez reconstruire les différentes archives pour rajouter vos fichiers de configurations, pour cela, utiliser la commande ant modules. Une fois les modules construits, procéder à leur chargement en utilisant les commandes :
./bin/signserver.sh module add dist-server/pdfigner.mar production ./bin/signserver.sh module add dist-server/tsa.mar production
Procéder à la vérification des modules, si tout est conforme, vous pouvez activer l'ajout du jeton d'horodatage dans la signature des documents PDF en exécutant les commandes suivantes :
./bin/signserver.sh setproperty PDFSigner TSA_URL http://localhost:8080/signserver/process?workerName=TSA ./bin/signserver.sh reload 1
Vérifier que vous disposer du répertoire
$SIGNSERVER_HOME/dist-client/signserverandvalidationapi.
Si ce n'est pas le cas, modifier dans le ficher
signserver_build.properties que la valeur
signingandvalidationapi.enabled est à true, puis
exécuter la commande ant (sans argument).
Copier les JAR depuis
$SIGNSERVER_HOME/dist-client/signserverandvalidationapi/lib
ainsi que le jar
$SIGNSERVER_HOME/modules/SignServer-Client-SigningAndValidationAPI/signserverandvalidationapi.jar.
Voici un code d'exemple :
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.signserver.client.api.ISigningAndValidation;
import org.signserver.client.api.SigningAndValidationWS;
import org.signserver.common.GenericSignResponse;
/**
*
* @author bbonfils
*/
public class SignServerClient {
public SignServerClient(String input, String output) {
byte[] inputByte = readFile(input);
byte[] signedByte = signDocument(inputByte);
writeFile(signedByte, output);
}
public final byte[] readFile(String filename) {
File file = new File(filename);
byte[] b = new byte[(int) file.length()];
try {
FileInputStream instream = new FileInputStream(file);
instream.read(b);
} catch (Exception e) {
System.err.println("Exception: " + e);
}
return b;
}
public final void writeFile(byte[] data, String filename) {
File file = new File(filename);
try {
FileOutputStream outStream = new FileOutputStream(file);
outStream.write(data);
outStream.close();
} catch (Exception e) {
System.err.println("writeFile exception: " + e);
}
}
public final byte[] signDocument(byte[] data) {
byte[] signedData = null;
try {
ISigningAndValidation signserver = new SigningAndValidationWS("tests.asyd.net", 8080);
GenericSignResponse signResp = signserver.sign("PDFSigner", data);
signedData = signResp.getProcessedData();
} catch (Exception e) {
System.err.println("signDocument exception: " + e);
}
return signedData;
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
if (args.length == 2) {
SignServerClient client = new SignServerClient(args[0], args[1]);
} else {
System.out.println("Invalid syntax");
}
}
}