1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
/**
* Genere un certificat.
* @param int $idClient l'ID du client
* @param string $serveur le nom du serveur
* @param string $region le nom de la region
* @param string $ville le nom de la ville
* @param string $societe le nom de la societe
* @param string $nomPrenom le nom et le prenom de la personne
* @param string $email l'adresse e-mail de la personne
* @param int $dureeValidite la duree de validite du certificat
* @param boolean $verifClient initialisé à false ; si true, on vérifie le client
* @param string $suffixeCert le suffixe à rajouter au certificat
* @return string
*/
public function genererCertif($idClient, $serveur, $region, $ville, $societe, $nomPrenom, $email, $dureeValidite, $verifClient = false, $suffixeCert = '') {
// Définition de constantes.
define('nbSecondesHeure', 3600); // Nombre de secondes dans une heure.
define('nbHeuresJour', 24); // Nombre d'heures dans un jour.
define('nbJoursAnnee', 365); // Nombre de jours dans une année.
if ($verifClient) {
// On va verifier les donnees clients.
$clientsModel = new Default_Model_Clients(); // Creation d'un objet pour interagir avec la table Clients.
if (!$clientsModel->clientExists($serveur, $idClient, $societe)) // Si le client n'existe pas, on le cree.
$idClient = $this->_creerClient($idClient, $serveur, $region, $ville, $societe);
else // Sinon, on recupere son ID.
$idClient = $clientsModel->getClient($idClient, $serveur)->Id_Client;
}
if ($idClient != 0) { // Si l'ID client n'est pas 0, on commence la creation du certificat.
$date = time();
$dn = array(
'countryName' => 'FR',
'stateOrProvinceName' => $region,
'localityName' => $ville,
'organizationName' => $societe,
'organizationalUnitName' => $societe,
'commonName' => $nomPrenom,
'emailAddress' => $email
);
// Creation des objets necessaires aux interactions avec la DB.
$certif = new Default_Model_Certificats();
$autorite = new Default_Model_Autorites();
// On recupere les informations de l'autorite via l'ID autorite (qui dépend de APPLICATION_ENV).
$idAutorite = 0;
if (APPLICATION_ENV == 'production')
$idAutorite = 1;
else
$idAutorite = 2;
$uneAutorite = $autorite->getAutorite($idAutorite);
// Recuperation des informations du application.ini (besoin des path certif et AC).
$config = Zend_Registry::get('config');
// Le chemin vers l'AC.
$ac = 'file://' . $config->path->ac . $idAutorite . '/' . $uneAutorite->Nom_Autorite . '.crt';
$acKey = array( // Le chemin vers la cle privee de l'AC et egalement le mot de passe pour cette derniere.
'file://' . $config->path->ac . $idAutorite . '/' . $uneAutorite->Nom_Autorite . '.key',
$uneAutorite->Pass_Private_Key
);
$pKey = openssl_pkey_new(); // Creation de nouvelles cles privees et publiques.
$csr = openssl_csr_new($dn, $pKey); // Creation d'une nouvelle CSR.
$userCert = openssl_csr_sign($csr, $ac, $acKey, (nbJoursAnnee * $dureeValidite)); // Creation du certificat utilisateur (CSR signee avec l'AC).
if (!$userCert)
return 'Le certificat n\'a pu etre cree.<br />';
else {
// On cree les dossiers necessaires avant de recuperer tous les fichiers a creer.
$aFiles = Default_Lib_GestionFichiers::makeFilesName($idClient, $serveur, $suffixeCert);
$pass = Default_Lib_Divers::generatePassword(); // Creation d'un mot de passe.
openssl_x509_export($userCert, $cer); // On exporte le certificat X509 dans une variable.
// On supprime des chaines de caracteres dont on n'a pas besoin.
$cer = str_replace('-----BEGIN CERTIFICATE-----', '', $cer);
$cer = str_replace('-----END CERTIFICATE-----', '', $cer);
$cer = unpack('H*', base64_decode($cer)); // On recupere la chaine hexadecimale du certificat.
// On sauvegarde le mot de passe et la chaine dans des fichiers separes.
Default_Lib_GestionFichiers::addToFile($aFiles['mdp'] . '.txt', $pass);
Default_Lib_GestionFichiers::addToFile($aFiles['cert'] . '.cer', $cer[1]);
// Si l'export du certificat (en PKCS12), de la cle et de la CSR sont fait, alors on affiche un message de reussite
// et on enregistre les donnees dans la base de donnees.
if (
openssl_pkcs12_export_to_file($userCert, $aFiles['cert'] . '.p12', $pKey, $pass) &&
openssl_pkey_export_to_file($pKey, $aFiles['cert'] . '.key', $pass) &&
openssl_csr_export_to_file($csr, $aFiles['cert'] . '.csr')
) {
// Le tableau des donnees a ajouter dans la table.
$data = array(
'Id_Autorite' => $uneAutorite->Id_Autorite,
'Id_Client' => $idClient,
'Nom_Certificat' => substr(strrchr($aFiles['cert'], '/'), 1),
'countryName' => 'FR',
'stateOrProvinceName' => $region,
'localityName' => $ville,
'organizationName' => $societe,
'organizationalUnitName' => $societe,
'commonName' => $nomPrenom,
'emailAddress' => $email,
'Date_Creation' => $date,
'Date_Debut_Validite' => $date,
'Date_Fin_Validite' => ($date + (nbSecondesHeure * nbHeuresJour * nbJoursAnnee * $dureeValidite)) // Calcul de la date de fin de validite.
);
$idCertif = $certif->ajouter($data); // On insere dans la table.
// Tableau des donnees utilisateur pour l'e-mail.
$aInfos = array(
'toMail' => $email,
'toNom' => $nomPrenom,
'certifPass' => $pass
);
// On envoi un e-mail pour prevenir le client qu'un certificat lui a ete attribue.
// $emailRes = Default_Lib_GestionEmails::send('createCertif', $aTo, '', '', $aFiles['cert'] . '.p12', $pass);
$emailRes = Default_Lib_GestionEmails::send('createCertif', $aInfos, $aFiles['cert'] . '.p12');
// Si c'est un boolean, l'e-mail a bien ete envoye. Donc on retourne l'ID du certificat.
if (is_bool($emailRes) && $emailRes)
return $idCertif;
else
return 'Erreur lors de l\'envoi de l\'e-mail : <b><br />' . $emailRes . '</b>';
}
}
}
} |
Partager