Sécurité du Système d Information Mini PKI Nombres de pages : 9 Version : 1.0 Auteurs : HAMROUNI Makram POISSENOT Thomas ROUX Nicolas Destinataires : BOMBAL Sébastien Remarques : Aucune.
Tables des matières 1 Introduction... 1 1.1 Public Key Infrastructure (PKI)... 1 1.1.1 Pourquoi une PKI?... 1 1.2 Comment?... 1 1.2.1 A quoi servent les certicats?... 1 1.2.2 Notre Mini PKI... 1 2 OpenSSL... 2 2.1 Explication des commandes utilisé dans le script... 2 2.1.1 Création d un bi-clé... 2 2.1.2 Création d un certicat auto signé... 2 2.1.3 Pour signer un certicat... 2 2.1.4 Pour révoquer un certicat... 2 2.1.5 Pour (ré)générer la CRL (Certicate Revocation List)... 2 2.1.6 Pour générer un certicat pour l OCSP... 2 2.2 Explication du chier de conguration «openssl.cnf»... 2 2.2.1 Politique des certicats... 3 2.2.2 Pour le certicat racine... 3 2.2.3 Pour le certicat de l OCSP... 3 2.2.4 Pour paramétrer l adresse de l OCSP... 3 3 Utilisation des Certicats avec HTTPs... 4 3.1 Ajout du module SSL à apache... 4 3.2 Afchage des informations sur la page d accueil de l intranet... 4 4 Annexes... 5 4.1 vhost.conf... 5 4.2 index.php... 5 4.3 minipki.sh... 5 4.4 openssl.cnf... 7 Version 1.0 Mini PKI i
1 Introduction 1.1 Public Key Infrastructure (PKI) 1.1.1 Pourquoi une PKI? En utilisant la cryptographie asymétrique, une personne/entité a la possibilité de posséder une clé publique et une clé privée. Avec sa clé privée, la personne/entité peut s autier et signer des documents. Le problème est que pour vérier la signature d un document il faut la clé publique et être certain que c est bien la clé publique de la personne qui a signé le document (Autication). Pour résoudre ce problème, les PKI mettent à disposition sur un serveur les clefs publiques des utilisateurs sous la forme d'un certicat numérique. Une PKI (Public Key Infrastructure) est donc un système de gestion de clefs publiques qui assure la abilité de celles-ci à des tiers/entités grâces à des certicats et à la cryptographie asymétrique permettant de vérier ces certicats. On peut notamment, grâce à la PKI, générer des certicats, les renouveler une fois expirés ou les révoquer. An que le système soit utilisable et sûr, on publie les certicats, la liste des certicats révoqué et on propose l autication des entités grâce à leur certicats ainsi que le recouvrement d un certicat perdu. 1.2 Comment? Pour cela, la PKI contient une Autorité de certication (AC). L'autorité de certication est une autorité de conance qui délivre et gère des certicats de clef publique et des CRL (Certicate Revocation List) conformes à la recommandation X.509. Elle génère les certicats à clef publique et garantit l intégrité et la véracité des informations qu ils contiennent, en les signant avec sa propre clef privée. Pour cela elle se génère un bi-clé qu elle transforme en certicat et l auto-signe an de se créer son certicat racine. 1.2.1 A quoi servent les certicats? Les certicats, grâce à des opérations cryptographiques et à partir des informations contenus dans le certicat (signature et clé publique) offrent les garanties suivantes pour une transmission de données : Condentialité : Les informations échangées deviennent illisibles / Seul le destinataire légitime des données pourra déchiffrer le message. (Opération de chiffrement) Autication : On peut identier avec certitude l émetteur des données. Non-répudiation : L'émetteur des données ne pourra pas nier être à l'origine du message. Intégrité : Les données transmises n ont pas pu être modié/altérés. 1.2.2 Notre Mini PKI Notre Mini-PKI fournit donc les services suivants : o Fabrication de bi-clés pour utiliser la cryptographie asymétrique : o o Fabrication/publication d un certicat pour certier la clé publique Révocation d un certicat (en local ou par serveur OCSP (Online Certicate Status Protocol)) Version 1.0 Mini PKI Page 1
2 OpenSSL Pour réaliser notre Mini AC, nous avons utilisé OpenSSL. Nous l avons paramétré selon le chier de conguration fournit en annexe et pour utiliser openssl de manière transparente nous avons réalisé le script mini-pki.sh fournit lui aussi en annexe. 2.1 Explication des commandes utilisé dans le script 2.1.1 Création d un bi-clé genrsa : demande la création d un bi-clé (RSA) -aes256 : le bi-clé nouvellement créé sera chiffré par de l AES 256 bit -out x.key 4096 : chemin où mettre le bi-clé créé + longueur de la clé RSA a créer 2.1.2 Création d un certicat auto signé req : pour demander un travail sur un certicat -new : pour demander un nouveau certicat -x509 : Pour demander à ce que le nouveau certicat soit auto signé pas l AC -days X : Pour mettre la durée de validité du certicat égale à X jours -key x.key : Pour donner le chemin vers le bi-clé précédemment créé a utilisé pour la création du certicat -out ca.crt : Pour donner le chemin où mettre le nouveau certicat -extensions Y : Paramètre dans le chier openssl.cnf à utiliser pour la création du certicat 2.1.3 Pour signer un certicat ca : pour faire appel à l autorité de certication -in x.csr : chemin où trouver le certicat à signer -out x.crt : chemin où mettre le certicat signé 2.1.4 Pour révoquer un certicat ca : pour faire appel à l autorité de certication -revoke x.crt : certicat à révoquer 2.1.5 Pour (ré)générer la CRL (Certicate Revocation List) ca : pour faire appel à l autorité de certication -gencrl : option pour appeler la (ré)génération -out x.crl : chemin ou mettre la liste de révocation 2.1.6 Pour générer un certicat pour l OCSP Une clé non chiffré par AES ou DES : openssl req -new -newkey rsa:4096 -nodes -keyout./minica/private/ocsp.key -out./minica/csr/ocsp.csr Puis un certicate : openssl ca -extensions OCSP -in./minica/csr/ocsp.csr -out./minica/cert/ocsp.pem 2.2 Explication du chier de conguration «openssl.cnf» Ci-dessus, la plupart des parties du chier openssl.cnf est expliqué. Le reste est disponible en annexe Version 1.0 Mini PKI Page 2
2.2.1 Politique des certicats Mise en place de la politique demandée pour les certicats : [ policy_match ] countryname organizationname organizationalunitname emailaddress localityname commonname 2.2.2 Pour le certicat racine [ minica_root ] = match = match Pour dire qu il faut créer un certicat de type racine : basicconstraints subjectkeyidentier = critical, CA:true = hash authoritykeyidentier = keyid,issuer:always Pour limiter l utilisation du certicat a la génération de signature pour des certicat et des listes de révocation : keyusage nscomment nscarevocationurl = critical, keycertsign, crlsign = "Certicat Racine MiniCA (Dossier PKI)" = http://www.srs.epita.fr/ 2.2.3 Pour le certicat de l OCSP [ OCSP ] extendedkeyusage = OCSPSigning 2.2.4 Pour paramétrer l adresse de l OCSP (Ici, c est le localhost) authorityinfoaccess = OCSP;URI:http://127.0.0.1 Version 1.0 Mini PKI Page 3
3 Utilisation des Certicats avec HTTPs 3.1 Ajout du module SSL à apache Dans un premier temps, il faut activer le module SSL livré avec la distribution apache de debian. Pour ceci, un lien symbolique vers des chier ssl.conf et ssl.load de mods-available dans mods-enable, et enlever le port 80 des ports écoutés an de n écouter que les connexions sécurisé. On congure ensuite, les certicats de notre site an de faire marcher le mode sécurisé du protocole http (https) : SSLCerticateFile /home/npsr/pki/minica/cert/localhost.crt SSLCerticateKeyFile /home/npsr/pki/ssl.pem On autorise uniquement les connexions SSLv3 : SSL_PROTOCOL SSLv3 On passé ensuite à l intégration de notre CA an que les clients qui puisse se connecter à notre site web soit uniquement les personnes en possession du certicat : SSLCACerticateFile /home/npsr/pki/minica/public/minica.crt SSLVerifyClient require SSLCACerticatePath /home/npsr/pki/minica/ SSLCARevocationFile /home/npsr/pki/minica/public/minica.crl SSLVerifyDepth 4 Pour le reste de la conguration de l host voir le vhost.conf fourni en annexe 3.2 Afchage des informations sur la page d accueil de l intranet Il faut rajouter dans un premier temps dans la conguration d apache l export des variables SSL dans les variables php avant de coder la page en elle-même (voir annexe : index.php) : SSL_Options +StdEnvVars Version 1.0 Mini PKI Page 4
4 Annexes 4.1 vhost.conf NameVirtualHost *:443 <VirtualHost *:443> ServerName localhost DocumentRoot /var/www/ SSLEngine on SSL_PROTOCOL SSLv3 SSLCerticateFile /home/npsr/pki/minica/cert/localhost.crt SSLCerticateKeyFile /home/npsr/pki/ssl.pem SSLCACerticateFile /home/npsr/pki/minica/public/minica.crt SSLVerifyClient require SSLCACerticatePath /home/npsr/pki/minica/ SSLCARevocationFile /home/npsr/pki/minica/public/minica.crl SSLVerifyDepth 4 CustomLog /var/log/apache2/monsite-ssl-access.log combined ErrorLog /var/log/apache2/monsite-ssl-error.log <Directory "/var/www"> DirectoryIndex index.html index.htm index.php index.php3 Options -Indexes </Directory> </VirtualHost> 4.2 index.php <? echo "Bonjour M. ".$_SERVER['SSL_CLIENT_S_DN_CN']."<br/><br/>"; echo "Votre numéro de certicat est : ". $_SERVER['SSL_CLIENT_M_SERIAL']."<br/><br/>"; echo "Votre adresse email est : ".$_SERVER['SSL_CLIENT_S_DN_Email'];?> 4.3 mini-pki.sh #!/bin/sh # Récupération de l'emplacement du chier de conf openssl.cnf Version 1.0 Mini PKI Page 5
# pour créér au bon endroit la minica (cad pour que les # chemins relatifs du chier openssl.cnf soient corrects rep=`echo $OPENSSL_CONF sed -e "s/openssl\.cnf$//"` echo $rep if [ $# -ge 1 ] ; # Création des dossiers nécéssaires à la MiniCA pour OpenSSL if [ $1 = 'create-ca' ] ; mkdir -p $rep/minica/public $rep/minica/private $rep/minica/cert $rep/minica/csr touch $rep/minica/index.txt touch $rep/minica/serial echo "01" >> $rep/minica/serial openssl genrsa -aes256 -out $rep/minica/private/minica.key 4096 openssl req -new -x509 -days 3650 -key $rep/minica/private/minica.key -out $rep/minica/public/minica.crt - extensions minica_root # Test pour le bon usage du certicat openssl x509 -in $rep/minica/public/minica.crt -text -noout openssl x509 -purpose -in $rep/minica/public/minica.crt -noout if [ $1 = 'user-sign' ] ; str=`echo $2 cut -d '.' -f 1` openssl ca -in $2 -out $rep/minica/cert/$str.crt mv $2 $rep/minica/csr/ if [ $1 = 'revoke' ] ; openssl ca -revoke $2 if [ $1 = 'gencrl' ] ; openssl ca -gencrl -out $rep/minica/public/minica.crl Version 1.0 Mini PKI Page 6
if [ $1 = 'genocsp' ] ; openssl req -new -newkey rsa:4096 -nodes -keyout $rep/minica/private/ocsp.key -out $rep/minica/csr/ocsp.csr 4.4 openssl.cnf [ ca ] openssl ca -extensions OCSP -in $rep/minica/csr/ocsp.csr \ -out $rep/minica/cert/ocsp.pem default_ca = minica # La CA par défaut #################################################################### [ minica ] dir =./minica # Le dossier de base de la CA certs = $dir/cert # Où sont stockés les certicats signés crl_dir = $dir/public # Où est stocké la crl database = $dir/index.txt new_certs_dir = $dir/cert # database # Emplacement pour les nouveaux certifs. certicate = $dir/public/minica.crt # Certicat racine de minica serial = $dir/serial # Compteur pour les numéros de certifs private_key = $dir/private/minica.key # The private key # Comment out the following two lines for the "traditional" # (and highly broken) format. name_opt = ca_default # Subject Name options cert_opt = ca_default # Certicate eld options default_days = 365 # how long to certify for default_crl_days= 30 # how long before next CRL default_md = sha1 # which md to use. preserve = no # keep passed DN ordering # A few difference way of specifying how similar the request should look # For type CA, the listed attributes must be the same, and the optional # and supplied elds are just that :-) policy = policy_match Version 1.0 Mini PKI Page 7
authorityinfoaccess = OCSP;URI:http://127.0.0.1 # For the CA policy [ policy_match ] countryname organizationname organizationalunitname emailaddress localityname commonname = match = match #################################################################### [ req ] distinguished_name = req_distinguished_name x509_extensions = v3_ca # The extentions to add to the self signed cert [ req_distinguished_name ] countryname = Pays (Code de 2 lettres) countryname_default = FR countryname_min = 2 countryname_max = 2 stateorprovincename = Departement stateorprovincename_default = IDF localityname localityname_default = Ville = Paris 0.organizationName = Organisation 0.organizationName_default = Lab SRS organizationalunitname = Unité organizationalunitname_default = Promo2009 emailaddress = Courriel emailaddress_default = srs@srs.epita.fr emailaddress_max = 64 commonname = Commen Name commonname_default = localhost commenname_max = 64 Version 1.0 Mini PKI Page 8
[ req_attributes ] challengepassword = Un mot de passe challengepassword_min = 4 challengepassword_max = 20 [ v3_ca ] subjectkeyidentier=hash authoritykeyidentier=keyid:always,issuer:always #################################################################### [ minica_root ] basicconstraints = critical, CA:true subjectkeyidentier = hash authoritykeyidentier = keyid,issuer:always keyusage = critical, keycertsign, crlsign nscomment = "Certicat Racine MiniCA (Dossier PKI)" nscarevocationurl = http://www.srs.epita.fr/ #################################################################### [ OCSP ] extendedkeyusage = OCSPSigning Version 1.0 Mini PKI Page 9