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