#!/bin/bash
#
# ssl_gen_crt
#
# Author        : Nohaj
# Contact       : johan@slashroot.fr
# Date          : 12/02/20
# Version       : 1.2 (21/10/21)
# Description   : Script basique qui permet de generer une clé et un CSR a partir d'un FQDN dans l'optique de demander un certificat a notre CA
#               : Le fichier de conf ainsi que la clé privée et le csr générés sont stockés sur le montage NFS de l'équipe clusters
#               : La clé privée est ajoutée dans vault (admins/kv/certificats) si l'utilisateur a un accès configuré
# Require       : openssl et vault 
#

#
# Changelog
#
# V1.1 : mise au propre de tout le script
#
# V1.2 : ajout de la possibilite de creer des certificats en multi-domain
#


#
# Usage
#
usage(){
    echo ""
    echo "Usage : ssl_gen_crt NAME.slashroot.{fr|net} [NAME2.slashroot.{fr|net}]"
    echo ""
    echo "EXEMPLE :"
    echo "   ssl_gen_crt hello.slashroot.fr"
    echo "   ssl_gen_crt coucou.slashroot.fr coucou-dmz.slashroot.fr"
    echo ""
    echo "NOTES :"
    echo "    Bien mettre le fqdn "principal" en premier lorsqu'on demande du multi-domain"
    echo ""
}

#
# Variables et vérifications
#

if [[ $# -eq 0 ]] ; then
    usage
    exit 1
fi

# Le script prend X argements qui doivent etre un FQDN qui fini par slashroot.fr ou slashroot.net
if [[ $# -eq 1 ]] ; then
    CERT_TYPE="standard"
else
    CERT_TYPE="multi-domain"
    for fqdn in $@ ; do
    if [[ ! $fqdn == $1 ]] ; then 
            DOMAIN_LIST="$DOMAIN_LIST, DNS: $fqdn"
            if [[ ! $fqdn =~ .slashroot.fr$ ]] && [[ ! $fqdn =~ .slashroot.net$ ]] ; then
                usage
                exit 1
            fi
    fi
    done
fi

DOMAIN_LIST=${DOMAIN_LIST:2}

# Dossier de stockage pour les fichiers (conf, key et csr)
SSL_FOLDER="/slashroot/clusters/SSL_CRT"

if [[ ! -d $SSL_FOLDER ]] ; then
    echo "ERREUR - Le dossier de stockage $SSL_FOLDER n'est pas accessible"
    exit 1
fi

#
# Au boulot
#

echo -n "On genere key et csr pour $1 ? [o/N] : " ; read reponse

if [[ $reponse == "o" ]] || [[ $reponse == "O" ]] ; then

    if [[ -d ${SSL_FOLDER}/$1 ]] ; then
        echo -n "Un dossier existe deja pour ce FQDN, on archive et on regenere du neuf ? [o/N] : " ; read reponse
        if [[ $reponse == "o" ]] || [[ $reponse == "O" ]] ; then
            mv ${SSL_FOLDER}/$1 ${SSL_FOLDER}/$1_$(date +%Y-%m-%d)
        else
            echo "Abandon..."
            exit 2
        fi
    fi

    # On cree le dossier et on genere le .conf avec les infos de base
    mkdir ${SSL_FOLDER}/$1
    echo "[ req ]" > ${SSL_FOLDER}/$1/$1.conf
    echo "distinguished_name  = req_distinguished_name" >> ${SSL_FOLDER}/$1/$1.conf
    echo "prompt = no" >> ${SSL_FOLDER}/$1/$1.conf
    if [[ $CERT_TYPE == "multi-domain" ]] ; then
        echo "req_extensions = req_ext" >> ${SSL_FOLDER}/$1/$1.conf
    fi
    echo "[ req_distinguished_name ]" >> ${SSL_FOLDER}/$1/$1.conf
    echo "countryName = FR" >> ${SSL_FOLDER}/$1/$1.conf
    echo 'stateOrProvinceName = "Ile de France"' >> ${SSL_FOLDER}/$1/$1.conf
    echo "localityName = Paris" >> ${SSL_FOLDER}/$1/$1.conf
    echo "organizationName = Institut Slashroot" >> ${SSL_FOLDER}/$1/$1.conf
    echo "organizationalUnitName = DSI" >> ${SSL_FOLDER}/$1/$1.conf
    echo "commonName = $1" >> ${SSL_FOLDER}/$1/$1.conf
    if [[ $CERT_TYPE == "multi-domain" ]] ; then
	echo "[ req_ext ]" >> ${SSL_FOLDER}/$1/$1.conf
        echo "subjectAltName = $DOMAIN_LIST" >> ${SSL_FOLDER}/$1/$1.conf
    fi

    # On genere la cle et le csr
    openssl genrsa -out ${SSL_FOLDER}/$1/$1.key 4096 &> /dev/null
    openssl req -config ${SSL_FOLDER}/$1/$1.conf -new -key ${SSL_FOLDER}/$1/$1.key -out ${SSL_FOLDER}/$1/$1.csr

    # On affiche le csr pour que le gars n'ait plus qu'a copier/coller dans le formulaire de demande
    echo ""
    cat ${SSL_FOLDER}/$1/$1.csr
    echo ""

    # On essaie de mettre la clé privé dans vault en best effort
    echo "On essaie de mettre la cle privee dans vault (best effort)"
    echo ""
    cat ${SSL_FOLDER}/$1/$1.key | vault kv put admins/kv/certificats/$1 key=-
else
    echo "Abandon..."
    exit 1
fi
