Importer des certificats CA dans la JRE Java

Importation du certificat

Le magasin de certificat de Java se manipule à l’aide de l’utilitaire keytool qui se trouve dans le répertoire JAVA_HOME\bin.
Pour ne pas être confronté au problème des droits Administrateurs, on va utiliser le magasin d’autorité de certification de l’utilisateur.
Ce dernier se nomme trusted.cacerts et il se trouve dans le répertoire :

%APPDATA%\..\LocalLow\Sun\Java\Deployment\security

Problématique du répertoire JAVA_HOME

Sous Windows, le répertoire JAVA_HOME n’est pas définit pas défaut. Il va falloir le retrouver.
Il existe plusieurs solutions.
Celle que j’ai adopté consiste à explorer la base de registre. En effet, si Java est installé, alors il existe une branche :

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\<versionJava>

qui contient une clef nommé JavaHome. On va lire le contenu de cette clef.

La première étape consiste à déterminer quelle est la version de Java. On va lire la clef CurrentVersion de la branche :

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment

Windows fournit un utilitaire de lecture de la base de registre en ligne de commande :

reg query
set keyname=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment
for /f "tokens=3" %%B in ('reg query "%keyname%" /v  CurrentVersion ^| findstr /r ".*[0-9]\.*"') do set Famille_Java=%%B

Une fois cette valeur obtenue, on peut accéder à la branche contenant la clef Java_home

set keyhome=%keyname%\%Famille_Java%
for /f "tokens=3* skip=2" %%C in ('reg query "%keyhome%" /v  JavaHome') do set JAVA_HOME=%%C %%D
echo Java Home  %JAVA_HOME%

Problématique de l’existence du keystore utilisateur

Le fichier trusted.cacerts qui se trouve dans le répertoire

%APPDATA%\..\LocalLow\Sun\Java\Deployment\security

n’existe pas par défaut. Il est créé par le panneau de contrôle de Java si on utilise ce dernier pour importer les certificats.
L’utilitaire keytool permet de créer des magasins de certificat, il n’y a pas de problème, SAUF que par défaut, la console d’administration graphique Java met un mot de passe à vide («  ») sur ce keystore, et que l’outil keytool impose un mot de passe à 6 caractères.
La solution pour conserver la compatibilité avec la console d’administration Java est de procéder ainsi :

  • Prendre un ordinateur avec un keystore vide.
  • Importer dedans le certificat pour l’utilisateur.

  • Puis supprimer le certificat en cliquent sur le bouton ‘Enlever’

Il restera un fichier trusted.cacerts dans le répertoire

%APPDATA%\..\LocalLow\Sun\Java\Deployment\security

qui est un keystore vide, initialisé avec un mot de passe vide.

On récupère ce fichier qui sera réutilisé dans l’hypothèse ou l’utilisateur n’a pas encore de clefs dans son keystore.

set USER_KEYSTORE=%APPDATA%\..\LocalLow\Sun\Java\Deployment\security\trusted.cacerts
IF NOT EXIST %USER_KEYSTORE% copy trusted.cacerts %APPDATA%\..\LocalLow\Sun\Java\Deployment\security\

Importation du certificat

Les deux points précédents étant réglés, on peux procéder à l’importation du certificat.
Comme pour Firefox, on définit une variable %CERT_ALIAS% basée sur le nom du fichier sans son extension :

FOR /F "delims=.;" %%a in ("%1") do set CERT_ALIAS=%%a

(%1 est ici un nom de fichier passé en paramètre du script).

Puis on lance l’importation :

"%JAVA_HOME%\bin\keytool" -import -trustcacerts -keystore "%USER_KEYSTORE%" -storepass "" -noprompt -alias  %CERT_ALIAS% -file <fichier_certificat>

Vérification si le certificat est présent

Si on souhaite vérifier si le certificat est déjà installé on utilise son alias. Si on base l’alias sur le nom du fichier contenant le certificat, on peut alors facilement vérifier sa présence ou non.
On définit une variable %CERT_ALIAS% basée sur le nom du fichier sans son extension :

FOR /F "delims=.;" %%a in ("%1") do set CERT_ALIAS=%%a

(%1 est ici un nom de fichier passé en paramètre du script).
Puis on exécute une commande très proche de l’ajout, qui  va demander à lister le contenu du magasin, puis à y rechercher l’alias :

"%JAVA_HOME%\bin\keytool" -list -keystore "%USER_KEYSTORE%" -storepass %KEYTOOL_PASS%  -noprompt -file %1% | findstr %CERT_ALIAS%

en sortie de commande, si %ERRORLEVEL% vaut 0, c’est que l’alias existe dans la base de l’utilisateur, donc que ce certificat est déjà installé.
Sinon il ne l’est pas.

Script pour Java uniquement

A l’aide des éléments ci-dessus, voici un script qui combine l’ensemble et permet d’importer le certificat qui est passé en paramètre, si ce dernier n’est pas déjà présent dans le magasin de l’utilisateur :

@echo off
rem Script d'importation du certificats d'autorité racine
rem dans le magasin Java
rem
rem 17-09-2014 : FL Création
rem
echo ====================================================
echo + Importation du certificat %1 +
echo ====================================================
echo.
SETLOCAL

rem clef de la base de registre qui contient les valeurs pour la jre
set keyname=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment
set KEYTOOL_PASS=""
set USER_KEYSTORE=%APPDATA%\..\LocalLow\Sun\Java\Deployment\security\trusted.cacerts

rem Alias du certificat = nom du fichier sans l'extension
FOR /F "delims=.;" %%a in ("%1") do set CERT_ALIAS=%%a

rem -------------------------------------------------
rem On vérifie la présence de Java
rem -------------------------------------------------
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment" | findstr /R "t.1\..\." > nul
IF %ERRORLEVEL% == 0 goto Java_Installe

echo --------------------------------------------------
echo Erreur ! Pas d'installation de java trouvée.
echo --------------------------------------------------
goto fin

:Java_installe
rem -------------------------------------------------
rem version du java installé
rem -------------------------------------------------

for /f "tokens=3" %%B in ('reg query "%keyname%" /v  CurrentVersion ^| findstr /r ".*[0-9]\.*"') do set Famille_Java=%%B
echo Famille Java installé  %Famille_Java%

rem -------------------------------------------------
rem Récupération de la valeur JAVA_HOME
rem -------------------------------------------------

set keyhome=%keyname%\%Famille_Java%
for /f "tokens=3* skip=2" %%C in ('reg query "%keyhome%" /v  JavaHome') do set JAVA_HOME=%%C %%D
echo Java Home  %JAVA_HOME%

rem ----------------------------------------------------------------------
rem On vérifie si le keystore existe.
rem Si non, on recopie un keystore vierge avec mot de passe vide pour
rem respecter les valeurs par défaut de Java.
rem -----------------------------------------------------------------------
IF NOT EXIST %USER_KEYSTORE% copy trusted.cacerts %APPDATA%\..\LocalLow\Sun\Java\Deployment\security\

rem Test si le certificat est déjà installé.
"%JAVA_HOME%\bin\keytool" -list -keystore "%USER_KEYSTORE%" -storepass %KEYTOOL_PASS% -noprompt -file "%1%" ^| findstr %CERT_ALIAS% > nul
IF %ERRORLEVEL% == 0 goto Certificat_Java_OK

rem Certificat non présent,on l'installe
echo Installation du Certificat pour Java
"%JAVA_HOME%\bin\keytool" -import -trustcacerts -keystore "%USER_KEYSTORE%" -storepass %KEYTOOL_PASS% -noprompt -alias %CERT_ALIAS% -file "%1%"
ENDLOCAL
goto suite
:Certificat_Java_OK
echo Certificat Java déja installé.
goto fin
:suite
echo Installation terminée.
:fin

 

Posts relatifs

Laisser un commentaire


NOTE - Vous pouvez utiliser les éléments et attributs HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">