Certificat valide uniquement à certaines dates

Petit nouveau ! | 5 Messages

29 janv. 2016, 10:52

Salut,

J'ai tenté de générer des certificats SSL avec php. Ca marche assez bien (suivant les recettes là : http://php.net/manual/fr/function.openssl-csr-new.php).
Par contre, je cherche comment faire pour avoir un certificat qui soit valide entre une date D1 et une autre D2, choisie par moi.

Avec le open_csr_new et le openssl_csr_sign, on peut donner la durée de validité du certif, mais pas les dates ValidFrom et ValidTo (ce qu'on peut faire sans soucis directement avec openssl en ligne de commande).

Une idée pour faire ça ?
Merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

29 janv. 2016, 11:06

Bonjour,

Une piste ici (je ne suis pas un expert en certificat SSL) : http://stackoverflow.com/questions/6296 ... penssl-req
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 5 Messages

29 janv. 2016, 11:24

Merci @rthur :)
c'est ça, effectivement, avec les "-startdate" et "-enddate" de openssl, on peut mettre ce qu'on veut.
C'est à la signature du certificat, donc, en toute logique avec http://php.net/manual/fr/function.openssl-csr-sign.php
Sauf que dans les parametres, y'a que "int days" donc un nombre de jours.

Comme indiqué ici : http://security.stackexchange.com/quest ... te-request
ça se joue à la signature du certif. et j'aurai voulu trouver comment envoyer ces parametres à openssl_csr_sign parce que ré-écrire le fichier de conf ssl (rayon [ca]) à chaque fois me paraît un peu "too much".

Petit nouveau ! | 5 Messages

29 janv. 2016, 11:59

bref, faire ça quoi :
openssl ca -config /etc/openssl.cnf -policy policy_anything -out clientcert.pem -startdate 120815080000Z -enddate 120815090000Z -cert ca.pem -keyfile cakey.pem -infiles clientcert.csr

http://stackoverflow.com/questions/1194 ... an-one-day

mais en php.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

30 janv. 2016, 01:04

Merci @rthur :)
c'est ça, effectivement, avec les "-startdate" et "-enddate" de openssl, on peut mettre ce qu'on veut.
C'est à la signature du certificat, donc, en toute logique avec http://php.net/manual/fr/function.openssl-csr-sign.php
Sauf que dans les parametres, y'a que "int days" donc un nombre de jours.
Quand on a un doute, on peut vérifier dans les sources (en C) de PHP pour voir comment c'est géré derrière.
Voici la fonction openssl_csr_sign() : https://github.com/php/php-src/blob/715 ... sl.c#L2942
Et on voit aux lignes 3026 et 3027, que PHP avec cette fonction indique en dur le paramètre notBefore, et génère le notAfter en fonction du paramètre days :

Code : Tout sélectionner

X509_gmtime_adj(X509_get_notBefore(new_cert), 0); X509_gmtime_adj(X509_get_notAfter(new_cert), 60*60*24*(long)num_days);
:arrow: Donc en résumé, c'est mort en utilisant les fonctions php_openssl pour faire ce que tu veux.


:idea: La solution est donc d'exécuter directement "openssl ca" comme si tu le faisait en ligne de commande, grace aux fonctions system() ou exec() de PHP
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 5 Messages

31 janv. 2016, 15:25

merci @rthur, au moins, je sais que c'est cuit !
bon, j'aurai voulu utiliser php, mais tant pis.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

31 janv. 2016, 23:27

bon, j'aurai voulu utiliser php, mais tant pis.
Bah avec les fonctions PHP exec() ou system() ça fonctionne, non ?
http://fr.php.net/system
http://fr.php.net/exec
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 5 Messages

01 févr. 2016, 10:24

Certes certes ;)
Je vais tenter par ce biais.