diff --git a/README.md b/README.md index e4639099c2cc45d5f595ce42a757c7c4d4a428e8..1a0253913d9e326c3ed21dc996c751ecd49dec97 100644 --- a/README.md +++ b/README.md @@ -26,3 +26,47 @@ se fait à partir des données du script sans passer par le disque (script `JS`) * `vp12.php` : valide les informations reçues, puis effectue les conversions vers le format P12 en utilisant l'extension `openssl`. Au final propose de télécharger le résultat +# Technique + +## Zones de saisie / upload de données + +Ce sont des `textarea` sur lesquelles un bouton (en fait un `input` de type `file`) permet de lancer +une sélection et un chargement de fichier. + +Voir dans le `JS` la fonction `getFile()` (associé à l'événement `change` de l'`input` `file`) qui utilise +la fonction `placeFileContent()` qui utilise `readFileContent()`. + +## Zone de récupération / download du résultat + +Le résultat (format P12) étant binaire, il n'est pas possible de passer par une `textarea`. + +La récupération passe par un lien (`a`, avec le type `application/octet-stream`, et dont l'aspect est « maquillé » +en bouton via la classe `btn`). Le script `JS` qui suit crée un `Blob` à partir des données du certificat P12, +et fait pointer le `href` du `a` dessus (URL virtuelle). + +La création du `Blob` passe par une conversion de/vers le format base64, car il n'est pas possible de mettre +une chaîne binaire dans du code `HTML` / `JS`. + +## Commandes openssl + +La conversion utilise l'extension `openssl`. Les commandes : + * `openssl_pkey_get_private($key, $password)` : charge la clé (`$key`, format PEM) protégée par le mot de passe + `$password` et retourne une « ressource de clé » (format anonyme interne à `openssl`) + * `openssl_pkcs12_export($cert, $cres, $skey, $password2)` : exporte le certificat PEM `$cert` et sa clé associée + `$skey` (voir juste au dessus) au format P12 (PKCS12) en le protégeant avec le mot de passe `$password2`. Le + résultat (binaire, format P12) est rangé dans `$cres` + +## Général + +Cet outil utilise l'authentification Apache via le LDAP du LIRIS. La vérification du _login_ n'est pas strictement +nécessaire. Toutefois ça permet : + * de limiter l'accès aux membres du laboratoire (ce n'est pas un outil public actuellement) + * de pouvoir proposer un nom de fichier pour la récupération du résultat (`$login.p12`) + +# Licence + +Copyright Yannick Perret / LIRIS, 2019-2020. +GPLv3. Ce code est réutilisable, sans garantie quelconque (à vos risques et périls… :)). Si vous réutilisez ce code +merci de m'en informer (yannick.perret@liris.cnrs.fr). + + diff --git a/vp12.php b/vp12.php index 5b2fd31e84409100291cfe6fdf061d370a308f71..2861e8fd31c97ab9fa56de259420c659473393fa 100644 --- a/vp12.php +++ b/vp12.php @@ -55,12 +55,12 @@ importer votre certificat dans un outil (navigateur…).</p> <p>Vous référer à la documentation pour l'import d'un certificat : <a href='https://INSEREZ.VOTRE.DOC'>https://INSEREZ.VOTRE.DOC</a></p> <a id='a' class='btn' download='$login.p12' type='application/octet-stream'>Télécharger le certificat format P12</a> -<script> _EOT_; // partie pour encoder le contenu ($cres) en base64 (on ne peut pas mettre du binaire directement // dans le code HTML) puis inversement, et permet le téléchargement echo <<<EOF +<script> /** * Convert a base64 string to an ArrayBuffer */