====== Gestion de clefs RSA ====== Le présent petit paquetage de gestion de clefs RSA, fondé sur l'outil en ligne de commande //openssl//, peut être trouvé dans le sous-répertoire //easy-rsa// de la distribution //OpenVPN//. Ceci constitue les notes de référence. Les instructions pas à pas se trouvent dans le HOWTO : http://openvpn.net/howto.html ===== Installation ===== - éditez le fichier //vars// ; - faites pointer //KEY_CONFIG// vers le fichier //openssl.cnf// inclus dans la présente distribution ; - faites pointer //KEY_DIR// vers le répertoire qui contiendra les clefs, certificats, etc. Ce répertoire peut ne pas exister mais s'il existe, il sera purgé par un //rm -rf//, donc **soyez prudent** dans la détermination de //KEY_DIR// ; - (optionnel) ajustez les autres champs du fichier //vars// en fonction de vos données de site. Vous pouvez souhaiter augmenter //KEY_SIZE// à 2048 si vous êtes paranoïaque et n'avez rien à faire de ralentir le traitement des clefs mais 1024 est certainement parfait pour les tests. //KEY_SIZE// doit être configuré à l'identique des deux côtés de la connexion SSL/TLS ; - //. vars// - //./clean-all// - Pour la création de certificats, clefs et requêtes de signature de certificats, vous devez comprendre que seuls les fichiers //.key// doivent rester confidentiels. Les fichiers //.crt// et //.csr// peuvent être transmis sur des canaux non sécurisés tels que le courriel en texte simple ; - il n'est jamais nécessaire de copier un fichier //.key// entre des ordinateurs. Normalement, chaque machine doit avoir sa propre paire certificat/clef. ===== Créer son propre certificat d'autorité racine de certification (root CA) ===== - //./build-ca// - les fichiers //ca.crt// et //ca.key// seront créés dans le répertoire //KEY_DIR// ===== Créer un certificat d'autorité intermédiaire de certification (optionnel) ===== - //./build-inter inter// - les fichiers //inter.crt// et //inter.key// seront créés dans le répertoire //KEY_DIR// et signés avec votre certificat racine. ===== Créer les paramètres Diffie-Hellman ===== Cette étape est nécessaire du côté serveur d'une connexion SSL/TLS. - //./build-dh// ===== Créer une requête de signature de certificat ===== Procédure pour signer un certificat si le certificat de l'autorité racine est contrôlé par une personne ou une autorité tierce ou encore s'il réside sur une autre machine. - récupérez le certificat //ca.crt// de votre autorité de certification. Quoique ce transfert puisse être réalisé par une canal non sécurisé, pour éviter une attaque de type homme du milieu (//man-in-the-middle//), il faut garantir que //ca.crt// n'ait pas été compromis. Les grosses autorités de certification résolvent ce problème en greffant leurs certificats racine dans les navigateurs web courants. Une méthode simple pour vérifier une autorité racine est de téléphoner à l'émetteur pour confirmer que la signature //md5sum// ou //sha1sum// du certificat //ca.crt// correspond (par exemple avec la commande « //md5sum ca.crt// »). - choisissez un nom pour votre certificat, par exemple le nom de votre ordinateur. Dans notre exemple, nous utilisons « //mycert// ». - //./build-req mycert// - la plupart des champs peuvent être ignorés sauf « //Common Name// » qui doit être unique, tel que le nom de votre ordinateur. Laissez vides tous les champs mot de passe, sauf si vous voulez protéger votre clef privée de cette manière. L'utilisation d'un mot de passe n'est pas nécessaire -- elle rendra votre clef plus sécurisée mais aussi plus complexe à utiliser, puisque vous devrez fournir celui-ci à chaque utilisation de la clef. **Note** : pour utiliser un mot de passe, utilisez la commande //./build-req-pass// au lieu de //./build-req//. - la clef sera placée dans //$KEY_DIR/mycert.key// - la requête sera placée dans //$KEY_DIR/mycert.csr// - expédiez //mycert.csr// au détenteur de l'autorité racine ; cela peut être effectué par un canal non sécurisé. - une fois le fichier//.csr// signé par le certificat de l'autorité racine, vous recevrez un fichier contenant votre certificat //mycert.crt//. Placez-le dans votre répertoire //KEY_DIR//. - la combinaison des fichiers //mycert.crt//, //mycert.key// et //ca.crt// peut désormais être utilisée pour sécuriser une extrémité d'une connexion SSL/TLS. ===== Signer une requête de signature de certificat ===== (NdT: Procédure pour signer un certificat si l'on est soi-même détenteur du certificat de l'autorité racine) - //./sign-req mycert// - le fichier //mycert.crt// sera créé dans le répertoire //KEY_DIR// à l'aide des informations des fichiers //mycert.csr// et du certificat d'autorité racine. ===== Créer et signer une requête de signature de certificat à l'aide d'un certificat racine installé en local ===== Ce script engendre et signe un certificat en une seule étape mais nécessite que le certificat et la clef privée engendrés soient transmis au destinataire par un canal sécurisé. - //./build-key mycert// (sans protection par mot de passe) - OU //./build-key-pass mycert// (avec protection par mot de passe) - OU //./build-key-pkcs12 mycert// (format PKCS 12) - OU //./build-key-server mycert// (avec nsCertType=server) - //mycert.crt// et //mycert.key// seront créés dans le répertoire //KEY_DIR//, //mycert.crt// sera signé par l'autorité racine. Avec //./build-key-pkcs12//, une fichier supplémentaire contenant la clef privée, le certificat et le certificat de l'autorité //mycert.p12// sera créé. ===== Important ===== Pour éviter une possible attaque de l'homme du milieu qui consiste, pour un client autorisé, à tenter de se connecter à un autre client en se faisant passer pour le serveur, assurez-vous d'imposer une méthode de vérification du certificat par le client. Actuellement, quatre méthodes différentes permettent d'accomplir cela, par ordre de préférence décroissante : - créez votre certificat serveur avec le script //build-key-server// : le certificat engendré sera marqué comme serveur uniquement par //nsCertType=server//. Ajoutez ensuite la ligne « //ns-cert-type server// » à votre configuration client. Cela interdira aux clients de se connecter à un server qui ne dispose pas de la désignation //nsCertType=server//, même si le certificat a été signé par l'autorité indiqué dans la configuration d'OpenVPN (directive //--ca//) ; - utilisez la directive //--tls-remote// sur le client pour accepter/rejeter la connexion serveur en fonction du nom commun (« //Common Name// ») du certificat serveur ; - utilisez un script ou un greffon //--tls-verify// pour accepter/rejeter la connexion serveur en fonction d'un test personnalisé sur des éléments du sujet X509 embarqué dans son certificat ; - signez les certificats des serveurs avec une autorité et ceux des clients avec une autre. La directive de configuration « //ca// » du client devra référencer l'autorité de signature des serveurs tandis que celle des serveurs devra référencer l'autorité de signature des clients. ===== Notes ===== Pour afficher les champs d'un certificat : openssl x509 -in cert.crt -text