IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[OpenSSL] Recherche de tuto' [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut [OpenSSL] Recherche de tuto'
    Bonjour à toutes (y'en n'a pas beaucoup mais y'en a !) et à tous.

    Je suis en train de tester la bibliothèque OpenSSL de PHP pour créer des certificats clients. J'ai pu créer des clés sans souci et grâce à la doc de PHP.net je pense connaître les fonctions dont je vais avoir besoin.
    Cependant, j'ai un doute quant à l'ordre dans lequel je vais devoir effectuer mes actions.

    D'où ma demande, est-ce que vous auriez un tuto' à me donner sur comment créer des certificats avec OpenSSL en PHP SVP ?
    Mes recherches n'ont pas été très fructueuses...

    Merci d'avance !

    PS : je travaille sur un serveur Debian.

  2. #2
    Membre habitué
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2010
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2010
    Messages : 111
    Points : 152
    Points
    152

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par Soull Voir le message
    aucun rapport avec le OpenSSL de PHP

  4. #4
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Merci Soull mais comme le dit stealth35, ça n'a effectivement rien à voir avec le librairie PHP OpenSSL...

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    montre ce que t'as fait pour l'instant

  6. #6
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Ben pas grand chose ! xD J'ai un projet Zend, un controller Index et dans ce dernier j'ai une action qui me créé une CSR.

    Et en fait après, je sais qu'il faut que je créé un certificat autosigné mais par la suite, qu'est-ce qu'il faut que je fasse ? Dans quel ordre ? Avec quelles méthodes d'OpenSSL ?

  7. #7
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Yop.

    Ca fait un moment, mais comme j'ai résolu mes soucis, j'me suis dit que j'allais partager la solution en retombant par hasard sur ce sujet. ^^

    Voici la méthode me permettant de créer et sauvegarder un certificat (avec plein de trucs en plus, mais c'est propore à mon projet et j'ai la flemme de faire le tri ^^).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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>';
    				}
    			}
    		}
    	}
    Je mets le sujet en "Résolu".

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WebForms]Recherche un tuto
    Par zooffy dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 21/06/2006, 11h05
  2. recherche de tuto detaillés
    Par rostomides dans le forum Bases de données
    Réponses: 1
    Dernier message: 07/04/2006, 21h38
  3. [VB6]Recherche de tutos introuvable
    Par benbetto dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 12/03/2006, 20h51
  4. [NASM] Recherche de tuto en français
    Par fabnet dans le forum Assembleur
    Réponses: 4
    Dernier message: 31/03/2005, 20h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo