sdeon@cloud-morning.fr Septembre 2015 1
Le chiffrement seul permet de protéger les informations Pour HTTP, il y a une couche de chiffrement, d authentification et de contrôle d intégrité avec la surcouche HTTPS (ou HTTP over SSL; en réalité TLS) SSL est la couche cryptographique entre TCP et HTTP SSL peut être utilisé avec IMAP, SMTP, FTP 2
On a besoin de savoir qu on se connecte bien sur un site web (ex : https://www.cloud-morning.fr et non http://www.cloud-morning.fr) certificat serveur On a besoin de savoir que c est bien l utilisateur Sébastien DEON qui se connecte au site web certificat SSL utilisateur Certificat SSL = carte d identité délivrée par une mairie (autorité) à une personne physique ou morale Certificat utilisateur + certificat server = «ceinture et bretelle» 3
Une autorité de certification (AC) qui est garante de la correspondance entre certificat et entité (personne, entreprise, site web, adresse mail, ) Une entité demande un certificat (requête ou demande de certificat) Mécanisme de bi-clés (clé privée et clé publique) La clé privée (secrète) permet de chiffrer des informations La clé publique (connue de tous) permet de déchiffrer; elle est intégrée dans la demande de certificat Les 2 clés sont stockées dans des fichiers au format PEM (le plus courant) L AC vérifie les informations de la demande L AC signe la demande certificat L AC produit le certificat valide et vérifiée L AC envoie le certificat au demandeur Le couple certificat/clé privée est utilisable par l utilisateur Quand un tiers veut vérifier l identité d une entité, il lui demande son certificat et vérifie la signature de l AC (si c est un tiers de confiance, pas de problème) 4
Certificats clients (ou utilisateurs) Sont destinés à l authentification des utilisateurs Ex : certificat des impôts Permet la signature des mails, l authentification de services VPN, Certificats serveurs Destinés aux serveurs. Permettent d assurer aux clients que l identité annoncée par le serveur est bien réelle (cas des sites bancaires) 5
Acheter un certificat serveur ou utilisateur Gandi, Verisign, TBS, StratSSL, Ex : chez Gandi, avec un nom de domaine, le certificat serveur sur un seul nom DNS (ex : www.cloudmorning.fr) est gratuit la première année (ensuite, environ 15 euros/an) Un certificat wildcard (ou joker ou *) permet de disposer d autant de certificat serveur que l on veut sur un domaine (ex : cloud-morning.fr avec certificat pour www, ftp, pki, ) Devenir sa propre autorité de certification installer une PKI (payante ou gratuite) gérer les certificats avec la commande openssl 6
Un serveur sous Linux qui est l AC avec la gestion openssl Un serveur sous Linux qui est serveur Web apache, mode SSL qui dispose d un site web sécurisé (ex : https://cloud.inpl.fr) Un poste de travail qui accède au site web sécurisé (https) 7
Créer une AC avec openssl Il faut une clé privée, une demande de certification, signer cette demande Installer openssl sous linux au préalable Répertoire de travail : # mkdir p /srv/ssl # cd /srv/ssl # mkdir certs crl newcerts private # echo 01 > serial # touch index.txt # cp /usr/lib/ssl/openssl.cnf. Sous CentOS 6.5, openssl.cnf est dans /etc/pki/tls/openssl.cnf 8
Editer le fichier openssl.cnf dir=/srv/ssl Clé privée de l AC /srv/ssl# openssl genrsa des3 out private/cakey.pem 4096 Choisir un mot de passe qui protégera la clé On obtient un fichier cakey.pem 9
Création d un certificat auto-signé /srv/ssl# openssl req config openssl.cnf new x509 nodes sha1 days 1825 key private/cakey.pem out cacert.pem On veut ainsi produire un certificat (req) avec l option 509 et qui doit être signé, avec une durée de validité de 5 ans (1825 jours). On précise la commande ou lire la clé privée et on génère le fichier cacert.pem Il faut le mot de passe de la clé privé et ensuite les informations qui seront intégrées dans le certificat : State : Lorraine Locality : Nancy Common Name : admin inpl Email : admin@inpl.fr Ce certificat auto-signé peut être utilisé auprès de futurs visiteurs de notre site web sécurisé 10
Notre serveur est une AC donc on peut générer des demandes de certificats Le point important ici est le CN qui doit être le nom du serveur web en FQDN (ex : cloud.inpl.fr) Création d une clé et demande de certificat Génération d une clé privée : /sr/ssl# openssl genrsa des3 out cloudinpl.key.pem 4096 Saisir un mot de passe protégeant la clé privée Génération de la demande de certificat # openssl req config openssl.cnf new key cloudinpl.key.pem out cloudinpl.csr.pem Saisir le common name : cloud.inpl.fr C est ce fichier.csr.pem qu il faudrait transmettre à une AC classique sur Internet Signature de la demande par l AC et production du certificat # openssl ca config openssl.cnf policy policy_anything out cloudinpl.cert.pem infiles cloudinpl.csr.pem 11
La clé privée du certificat serveur est protégée par un mot de passe; il faut retirer la protection du mot de passe (sinon, on sera bloqué à chaque redémarrage du serveur apache) # openssl rsa in cloudinpl.key.pem out cloudinpl.key.nopass.pem Saisir le mot de passe de la clé privée 12
Résolution de nom (/etc/hosts) <IP_server> cloud.inpl.fr Créer un dossier /srv/ssl/cloudinpl Copier tous les fichiers précédents (cloudinpl.*) dans ce dossier Installer le mod_ssl : #yum install mod_ssl Modifier la configuration d Apache : /etc/httpd/conf.d/ssl.conf : NameVirtualHost *:443 Ajouter un fichier de configuration pour le site protégé cloud.inpl.fr Le site web est dans /var/www/cloudinpl Créer un fichier index.html : Bonjour, vous êtes bien sur le serveur du cloud INPL Rajouter la configuration dans ssl.conf <Virtualhost *:443> ServerName cloud.inpl.fr (nom du site web sécurisé) DocumentRoot /var/www/cloudinpl (emplacement du site web) SSLEngine On SSLCertificateFile /srv/ssl/cloudinpl/cloudinpl.cert.pem (certificat serveur) SSLCertificateKeyFile /srv/ssl/cloudinpl/cloudinpl.key.nopass.pem (clé privée du certificat serveur déprotégée) SSLProtocol all SSLv2 (tous les protocoles SSL sauf la V2) </Virtualhost> - Activer le fichier de configuration : # /etc/init.d/httpd reload Accès au site : https://cloud.inpl.fr et demande d ajout d exception du certificat serveur 13
Le serveur demande aux clients de présenter leurs cartes d identité signées par une AC reconnue Création de 2 clés privées et de 2 demandes de certificats; le champs CN doit correspondre au nom de l utilisateur Clés privées : /srv/ssl/cloudinpl# openssl genrsa des3 out alice.cloudinpl.key.pem 4096 /srv/ssl/cloudinpl# openssl genrsa des3 out bob.cloudinpl.key.pem 4096 Demande de certificats : /srv/ssl/cloudinpl# openssl req config../openssl.cnf new key alice.cloudinpl.key.pem out alice.cloudinpl.csr.pem Dans le CN : mettre alice Idem pour bob Signature des certificats /srv/ssl/cloudinpl# openssl ca config../openssl.cnf policy policy_anything out alice.cloudinpl.cert.pem infiles alice.cloudinpl.csr.pem /srv/ssl/cloudinpl# openssl ca config../openssl.cnf policy policy_anything out bob.cloudinpl.cert.pem infiles bob.cloudinpl.csr.pem 14
Les certificats clients doivent comprendre la clé secrète pour être utilisables. Le seul format lisible par Firefox est le format PKCS#12 (.p12) qui contient la clé publique et la clé privée du certificat utilisateur Conversion des fichiers PEM : /srv/ssl/cloudinpl# openssl pkcs12 export inkey alice.cloudinpl.key.pem in alice.cloudinpl.cert.pem out alice.cloudinpl.cert.p12 name Alice Idem pour Bob Deux mots de passe sont demandés : Celui qui protège le fichier PEM à ouvrir Celui qui protège le fichier.p12 créé Importer le certificat.p12 dans le navigateur; il faut saisir le mot de passe du.p12 Firefox : Edition / Préférences / Avancés / Certificats / Afficher les certificats / Importer 15
Fichier /etc/httpd/conf.d/ssl.conf <VirtualHost _default_:443> ServerName cloud.inpl.fr DocumentRoot /var/www/cloudinpl <Directory /var/www/cloudinpl> Options Indexes FollowSymLinks MultiViews AllowOverride None </Directory> SSLEngine On SSLCertificateFile /srv/ssl/cloudinpl/cloudinpl.cert.pem SSLCertificateKeyFile /srv/ssl/cloudinpl/cloudinpl.key.nopass.pem SSLCACertificateFile /srv/ssl/cacert.pem SSLProtocol all -SSLv2 ErrorLog /var/log/httpd/error_ssl.log LogLevel warn CustomLog /var/log/httpd/ssl_access.log combined SSLVerifyClient require SSLVerifyDepth 1 </VirtualHost> </IfModule> SSLCACertificateFile indique au serveur quelle est l AC sur laquelle se baser pour vérifier les certificats SSLVerifyClient require permet de n autoriser que les clients qui présentent un certificat correctement signé SSLVerifyDepth permet de limiter la longueur de la chaîne de confiance Tester l accès au site web sécurisé avec le certificat client 16