====== Génération de certificats autosignés ====== Ce script permet de générer rapidement des certificats autosignés (en créant les clés et certifs de l'autorité de certification au passage si besoin). #!/bin/bash # auteur : Daniel Caillibaud, daniel@lairdutemps.org # script sous licence CC-by-sa : http://creativecommons.org/licenses/by-sa/2.0/fr [ $UID -ne 0 ] && echo "Ce script doit être exécuté par root" && exit 1 # génération d'un certificat autosigné. KEYDIR=/etc/ssl/private CRTDIR=/etc/ssl/certs SRLDIR=/etc/ssl/srl NBJVALID=730 [ -d $KEYDIR ] || mkdir $KEYDIR [ -d $CRTDIR ] || mkdir $CRTDIR [ -d $SRLDIR ] || mkdir $SRLDIR function usage() { echo "usage: $(basename $0) -a authority -h host -s server" echo "Ce script va générer une clé pour le host (si elle n'existe pas) et un certif pour le server" echo "en le signant par authority." echo "Il crée également l'autorité de certification si elle n'existe pas." echo "Le host est en général le nom de la machine et server le nom de celui qui va utiliser le certif (ssl, mail...)" echo "Par exemple, pour créer un certif pour apache pour ssl.domaine.tld sur la machine ns1.domaine.tld signé par ca.domaine.tld, on lancera" echo "$(basename $0) -a ca.domaine.tld -h ns1.domaine.tld -s ssl.domaine.tld" exit 1 } # MAIN host='' server='' # check des options while getopts "a:h:s:" OPTION do case $OPTION in a ) ca=$OPTARG;; h ) host=$OPTARG;; s ) server=$OPTARG;; * ) usage;; esac done [ -z "$ca" ] && echo "Il faut préciser le nom de l'autorité de certification" && usage && exit 1 [ -z "$host" ] && echo "Il faut préciser le nom du host dont on doit utiliser la clé" && usage && exit 1 [ -z "$server" ] && echo "Il faut préciser un nom pour le serveur qui va utiliser le certificat" && usage && exit 1 # on peut y aller # fichiers hostkey=$KEYDIR/$host.key cakey=$KEYDIR/$ca.key cacrt=$CRTDIR/$ca.crt casrl=$SRLDIR/$ca.srl servercsr=$CRTDIR/$server.csr servercrt=$CRTDIR/$server.crt serverpem=$CRTDIR/$server.pem # couleurs VERT='\e[0;32m' ROUGE='\e[0;31m' NORM='\e[0;00m' # check clé / certif de l'autorité de certif if [ ! -f "$cakey" ] || [ ! -f "$cacrt" ] then echo -e "\n${VERT}Génération de la clé privée pour l'autorité de certification (soi-même en l'occurence) (avec passphrase) :$NORM" openssl genrsa -des3 1024 > $cakey echo -e "\n${VERT}Génération du certificat de l'autorité de certification (pour 10 ans histoire de pas recommencer tous les jours)" echo -e "répondez ${ROUGE}${host}${VERT}à la question 'Common Name'$NORM" openssl req -new -x509 -days 3650 -key $cakey > $cacrt else echo -e "\n${VERT}La clé privée de l'autorité de certification ($cakey) et son certificat ($cacrt) existent déjà.$NORM" fi # check clé du host if [ ! -f "$hostkey" ] then echo -e "\n${VERT}Génération de la clé privée $hostkey$NORM" openssl genrsa 1024 > $hostkey else echo -e "\n${VERT}La clé $hostkey existe déjà.$NORM" fi echo -e "\n${VERT}Création du fichier de demande de signature de certificat (CSR Certificate Signing Request)" echo -e "Répondre ${ROUGE}${server}${VERT} à la question 'Common Name (eg, YOUR name)'" echo -e "Ce sera le CN (Common Name) du certificat.$NORM" openssl req -new -key $hostkey > $servercsr echo -e "\n${VERT}Signature du certificat pour $NBJVALID jours$NORM" openssl x509 -days $NBJVALID -req -in $servercsr -out $servercrt -CA $cacrt -CAkey $cakey -CAcreateserial -CAserial $casrl echo echo -e "\n${VERT}Créer aussi le fichier pem $serverpem [o/n] ?$NORM" read rep if [ "$rep" = 'o' ] then echo -e "\n${VERT}Mixage clé et certif.$NORM" cat $hostkey $servercrt > $serverpem openssl gendh >> $serverpem fi