Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
| ejbca_tls [2024/03/21 11:22] – nekan | ejbca_tls [2024/03/25 16:07] (Version actuelle) – [Par appel API] nekan | ||
|---|---|---|---|
| Ligne 105: | Ligne 105: | ||
| * On crée une requête de certification : | * On crée une requête de certification : | ||
| <sxh bash> | <sxh bash> | ||
| - | * On copie cette requête et on va sur l' | + | * On copie cette requête et on va sur l' |
| * Une fois sur l' | * Une fois sur l' | ||
| <image shape=" | <image shape=" | ||
| Ligne 119: | Ligne 119: | ||
| ==== Par appel API ==== | ==== Par appel API ==== | ||
| + | |||
| + | * Pour faciliter la création/ | ||
| + | <sxh bash># | ||
| + | |||
| + | ######################################### | ||
| + | # # | ||
| + | # | ||
| + | # # | ||
| + | ######################################### | ||
| + | |||
| + | # | ||
| + | # Variables # | ||
| + | # | ||
| + | |||
| + | # Dossier de travail | ||
| + | WorkingDirectory=/ | ||
| + | |||
| + | # Authentification pour le script | ||
| + | ScriptAuthentication=" | ||
| + | |||
| + | # Adresse de l' | ||
| + | AuthorityAddress=" | ||
| + | |||
| + | # Profil de certificat | ||
| + | CertificateProfileName=" | ||
| + | |||
| + | # Profil de serveur | ||
| + | EndEntityProfileName=" | ||
| + | |||
| + | # Nom de l' | ||
| + | CertificationAuthorityName=" | ||
| + | |||
| + | # Fichier de configuration pour openssl | ||
| + | OpensslConfig="/ | ||
| + | |||
| + | # Modèle de requête API | ||
| + | ApiTemplate=' | ||
| + | |||
| + | # Dossier racine pour les certificats | ||
| + | CertificateRoorDirectory=" | ||
| + | |||
| + | # Utilisateur pour l' | ||
| + | EnrollmentUser=" | ||
| + | |||
| + | # Mot de passe pour l' | ||
| + | EnrollmentPassword=" | ||
| + | |||
| + | # Fichier de réponse de l'API | ||
| + | ApiResponse="/ | ||
| + | |||
| + | # Certificat racine | ||
| + | RootCertificate=" | ||
| + | |||
| + | # Certificat intermédiaire | ||
| + | SubCertificate=" | ||
| + | |||
| + | # Fichier de log | ||
| + | ManageLog="/ | ||
| + | |||
| + | # Raison de révocation par défaut | ||
| + | RevokeReason=" | ||
| + | |||
| + | # Organisation | ||
| + | Organization=" | ||
| + | |||
| + | # Pays | ||
| + | Country=" | ||
| + | |||
| + | # | ||
| + | # Fonctions # | ||
| + | # | ||
| + | |||
| + | # Demande d'aide | ||
| + | display-help() { | ||
| + | echo " | ||
| + | echo " | ||
| + | echo "" | ||
| + | echo "Usage : ./ | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo "" | ||
| + | echo " | ||
| + | echo "" | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo "" | ||
| + | echo "< | ||
| + | echo "< | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo "" | ||
| + | } | ||
| + | |||
| + | # Identifiant d'un certificat | ||
| + | get-id() { | ||
| + | openssl x509 -noout -serial -in $CertificateRoorDirectory/ | ||
| + | } | ||
| + | |||
| + | # Status d'un certificat | ||
| + | get-status() { | ||
| + | curl -X GET -k -s \ | ||
| + | --cert-type P12 \ | ||
| + | --cert " | ||
| + | --header " | ||
| + | " | ||
| + | | jq . | ||
| + | } | ||
| + | |||
| + | # Révocation d'un certificat | ||
| + | revoke-certificate() { | ||
| + | curl -X PUT -k -s \ | ||
| + | --cert-type P12 \ | ||
| + | --cert " | ||
| + | --header " | ||
| + | " | ||
| + | | jq . | ||
| + | } | ||
| + | |||
| + | # Création du certificat | ||
| + | create-certificate() { | ||
| + | # Création du JSON pour la requête API | ||
| + | Json=$(jq -n \ | ||
| + | --arg ApiCsr " | ||
| + | --arg ApiCp " | ||
| + | --arg ApiEep " | ||
| + | --arg ApiCa " | ||
| + | --arg ApiUser " | ||
| + | --arg ApiPwd " | ||
| + | " | ||
| + | |||
| + | # Envoi de la requête | ||
| + | curl -X POST -s -k \ | ||
| + | --cert-type P12 \ | ||
| + | --cert " | ||
| + | --header ' | ||
| + | --data " | ||
| + | " | ||
| + | | jq . | ||
| + | } | ||
| + | |||
| + | # | ||
| + | # Arguments # | ||
| + | # | ||
| + | |||
| + | # Initialisation | ||
| + | action=" | ||
| + | fqdn=" | ||
| + | |||
| + | case $1 in | ||
| + | " | ||
| + | display-help | ||
| + | exit 0 | ||
| + | ;; | ||
| + | " | ||
| + | action=" | ||
| + | fqdn=" | ||
| + | reason=" | ||
| + | ;; | ||
| + | *) | ||
| + | echo " | ||
| + | echo "" | ||
| + | display-help | ||
| + | exit 2 | ||
| + | ;; | ||
| + | esac | ||
| + | |||
| + | # Vérification | ||
| + | if [ " | ||
| + | # Aucune action, affichage de l'aide | ||
| + | display-help | ||
| + | exit 1 | ||
| + | else | ||
| + | # Vérification du fqdn | ||
| + | if [ " | ||
| + | echo " | ||
| + | echo "" | ||
| + | display-help | ||
| + | exit 1 | ||
| + | elif [[ $fqdn =~ ^([a-z0-9]+([a-z0-9]|\-)*\.)+[a-z]{2, | ||
| + | true | ||
| + | else | ||
| + | echo " | ||
| + | exit 2 | ||
| + | fi | ||
| + | fi | ||
| + | |||
| + | # Log | ||
| + | echo " | ||
| + | |||
| + | # | ||
| + | # Traitement # | ||
| + | # | ||
| + | |||
| + | if [ " | ||
| + | |||
| + | # Vérification de l' | ||
| + | if [ " | ||
| + | # Renouvellement demandé | ||
| + | if [ ! -d $CertificateRoorDirectory/ | ||
| + | # Pas de certificat existant, création du dossier et de la clé privée | ||
| + | echo " | ||
| + | mkdir -p $CertificateRoorDirectory/ | ||
| + | echo " | ||
| + | openssl ecparam -genkey -name prime256v1 -out $CertificateRoorDirectory/ | ||
| + | echo " | ||
| + | elif [ ! -f $CertificateRoorDirectory/ | ||
| + | # Pas de clé privée à utiliser | ||
| + | echo " | ||
| + | openssl ecparam -genkey -name prime256v1 -out $CertificateRoorDirectory/ | ||
| + | else | ||
| + | # Vérification de la clé privée | ||
| + | CertificateChecksum=$(openssl x509 -noout -pubkey -in $CertificateRoorDirectory/ | ||
| + | PrivateKeyChecksum=$(openssl pkey -pubout -in $CertificateRoorDirectory/ | ||
| + | if [ " | ||
| + | # Clé valide | ||
| + | echo " | ||
| + | else | ||
| + | # Clé invalide | ||
| + | echo " | ||
| + | openssl ecparam -genkey -name prime256v1 -out $CertificateRoorDirectory/ | ||
| + | fi | ||
| + | fi | ||
| + | else | ||
| + | # Création demandée | ||
| + | if [ -f $CertificateRoorDirectory/ | ||
| + | # Certificat déjà existant | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | exit 1 | ||
| + | elif [ ! -d $CertificateRoorDirectory/ | ||
| + | # Création du répertoire pour le certificat | ||
| + | mkdir -p $CertificateRoorDirectory/ | ||
| + | echo " | ||
| + | |||
| + | # Création de la clé privée | ||
| + | openssl ecparam -genkey -name prime256v1 -out $CertificateRoorDirectory/ | ||
| + | echo " | ||
| + | else | ||
| + | # Création de la clé privée | ||
| + | openssl ecparam -genkey -name prime256v1 -out $CertificateRoorDirectory/ | ||
| + | echo " | ||
| + | fi | ||
| + | fi | ||
| + | |||
| + | # Création de la configuration pour openssl | ||
| + | if [ -e $OpensslConfig | ||
| + | rm -f $OpensslConfig | ||
| + | fi | ||
| + | |||
| + | echo "[ req ]" > $OpensslConfig | ||
| + | echo " | ||
| + | echo " | ||
| + | echo " | ||
| + | echo "" | ||
| + | echo "[ dn ]" >> $OpensslConfig | ||
| + | echo "CN = $fqdn" >> $OpensslConfig | ||
| + | echo "O = $Organization" | ||
| + | echo "C = $Country" | ||
| + | |||
| + | # Création de la requête | ||
| + | CsrContent=$(openssl req -new -key $CertificateRoorDirectory/ | ||
| + | |||
| + | # Envoi de la requête | ||
| + | CreateRequest=$(create-certificate " | ||
| + | |||
| + | # Extraction du certificat | ||
| + | echo $CreateRequest | jq -r .certificate > $CertificateRoorDirectory/ | ||
| + | |||
| + | # Conversion du DER en binaire | ||
| + | openssl base64 -d -A -in $CertificateRoorDirectory/ | ||
| + | |||
| + | # Conversion du binaire en PEM | ||
| + | openssl x509 -inform der -in $CertificateRoorDirectory/ | ||
| + | |||
| + | # Ajout des certificats racines et intermédiaires | ||
| + | cat $SubCertificate >> $CertificateRoorDirectory/ | ||
| + | cat $RootCertificate >> $CertificateRoorDirectory/ | ||
| + | |||
| + | # Log | ||
| + | echo " | ||
| + | exit 0 | ||
| + | |||
| + | elif [ " | ||
| + | |||
| + | # Recherche du n° de série du dernier certificat | ||
| + | CertificateSerialNumber=$(get-id $fqdn) | ||
| + | |||
| + | # Demande du status | ||
| + | CertificateStatusRequest=$(get-status $CertificationAuthorityName $Organization $CertificateSerialNumber) | ||
| + | |||
| + | # Extraction des données | ||
| + | CertificateExtractedStatus=$(echo $CertificateStatusRequest | jq .revoked) | ||
| + | if [ " | ||
| + | CertificateStatus=" | ||
| + | else | ||
| + | CertificateStatus=" | ||
| + | fi | ||
| + | CertificateDetails=$(echo $CertificateStatusRequest | jq .revocation_reason) | ||
| + | |||
| + | # Log | ||
| + | echo " | ||
| + | exit 0 | ||
| + | |||
| + | elif [ " | ||
| + | |||
| + | # Validation de la raison de la révocation | ||
| + | if [ -z " | ||
| + | echo " | ||
| + | else | ||
| + | case ${reason^^} in | ||
| + | " | ||
| + | RevokeReason=${reason^^} | ||
| + | echo " | ||
| + | ;; | ||
| + | *) | ||
| + | echo " | ||
| + | ;; | ||
| + | esac | ||
| + | fi | ||
| + | |||
| + | # Recherche du n° de série du dernier certificat | ||
| + | CertificateSerialNumber=$(get-id $fqdn) | ||
| + | |||
| + | # Demande du status | ||
| + | CertificateStatusRequest=$(get-status $CertificationAuthorityName $Organization $CertificateSerialNumber) | ||
| + | |||
| + | # Extraction des données | ||
| + | CertificateExtractedStatus=$(echo $CertificateStatusRequest | jq .revoked) | ||
| + | |||
| + | # Vérification | ||
| + | if [ " | ||
| + | |||
| + | # Révocation | ||
| + | RevokeRequest=$(revoke-certificate $CertificationAuthorityName $Organization $CertificateSerialNumber $RevokeReason) | ||
| + | |||
| + | # Extraction des données | ||
| + | RevokeStatus=$(echo $RevokeRequest | jq .revoked) | ||
| + | RevokeMessage=$(echo $RevokeRequest | jq .message) | ||
| + | |||
| + | # Log | ||
| + | if [ " | ||
| + | /usr/bin/rm -rf $CertificateRoorDirectory/ | ||
| + | echo " | ||
| + | exit 0 | ||
| + | else | ||
| + | echo " | ||
| + | echo " | ||
| + | exit 2 | ||
| + | fi | ||
| + | else | ||
| + | # Log | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | else | ||
| + | # Action inconnue | ||
| + | echo " | ||
| + | exit 3 | ||
| + | fi | ||
| + | </ | ||
| + | |||
| + | * Il suffit de modifier les variables : | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * On place le certificat du script dans '' | ||
| + | * Il ne reste plus qu'à lancer le script. | ||
| - | {{ : | ||
| ~~DISCUSSION~~ | ~~DISCUSSION~~ | ||