web-dev-qa-db-fra.com

Comment définir la valeur "Pas avant" sur passé lors de la création de la demande de certificat

Nous avons beaucoup de clients TLS intégrés sur le terrain. Les serveurs TLS doivent être authentifiés.

Étant donné que de longues coupures de courant peuvent réinitialiser l'horloge de ces appareils, nous devons utiliser des certificats avec une période de validité: de 19700101000001Z à 99991231235959Z.

Comment utiliser openssl pour créer des demandes de certificats avec ce type de période de validité?

Je ne trouve que le -days option pour définir la période, et cela ne suffit pas.

15
SKi

La période de fin de validité "99991231235959Z" peut vous poser problème, car certains logiciels convertissent toujours la date en une représentation interne en nombre de secondes depuis l '"Epoch" (1er janvier 1970, 00:00 UTC) sur un entier 32 bits signé. Cette représentation interne échoue le janvier 2038 . La définition d'une période de validité qui s'étend au-delà de cette date fatidique peut impliquer que vos certificats seront rejetés par certaines implémentations.

De plus, lorsqu'un appareil voit sa horloge réinitialisée en raison d'une longue coupure de courant, je suppose qu'il n'est pas réinitialisé à une date aléatoire; il est réinitialisé à une date "par défaut". La validité de votre certificat ne doit pas couvrir huit mille ans, mais "seulement" les jours actuels (pour les appareils avec une horloge bien ajustée) et les jours autour de la valeur par défaut à laquelle les horloges sont réinitialisées lorsqu'elles perdent de l'énergie. La définition de la période de validité de 1970 à 2037, par exemple, devrait couvrir tous les cas et conservera la représentation interne (si elle est utilisée par une implémentation spécifique) dans la plage où l'arithmétique signée 32 bits est bonne.

Sachez que si vos appareils n'ont pas d'horloge précise, vous ne bénéficierez pas d'une prise en charge fiable de la révocation , sauf si vous appliquez OCSP avec les nonces client.


Cela étant dit, la période de validité ne fait pas partie de la demande de certificat . La période est choisie au moment de l'émission du certificat, par l'AC.

outil de ligne de commande OpenSSL peut être utilisé comme une autorité de certification très grossière, bien qu'il ait été principalement conçu pour le débogage. Cet outil propose des "commandes", dont deux pouvant créer un certificat X.509, x509 et req . Les deux n'offrent qu'une seule option pour ajuster la période de validité, qui est le -days option. Ceci est tout à fait visible si vous regardez le code source , par exemple dans apps/x509.c:

            if ((x=X509_new()) == NULL) goto end;

            if (sno == NULL)
                    {
                    sno = ASN1_INTEGER_new();
                    if (!sno || !Rand_serial(NULL, sno))
                            goto end;
                    if (!X509_set_serialNumber(x, sno))
                            goto end;
                    ASN1_INTEGER_free(sno);
                    sno = NULL;
                    }
            else if (!X509_set_serialNumber(x, sno))
                    goto end;

            if (!X509_set_issuer_name(x,req->req_info->subject)) goto end;
            if (!X509_set_subject_name(x,req->req_info->subject)) goto end;

            X509_gmtime_adj(X509_get_notBefore(x),0);
            X509_time_adj_ex(X509_get_notAfter(x),days, 0, NULL);

Comme vous le voyez dans cet extrait de code, la nouvelle structure de certificat X.509 est créée (et définit par défaut le début et la fin de la période de validité à la date actuelle); les deux dernières lignes du code ajustent la période de validité en utilisant le paramètre days, et rien d'autre.

Donc, si vous souhaitez ajuster la période de validité à des dates arbitraires, vous avez deux possibilités:

  • Réglez la date actuelle de votre ordinateur sur la date de début que vous souhaitez utiliser, afin que openssl pense que nous sommes vraiment au début des années 1970; Et mettre -days à 24 000 environ. C'est un hack horrible et le réglage de l'horloge de votre ordinateur dans le passé pré-Disco peut être difficile (les ordinateurs modernes règlent automatiquement leur horloge avec NTP ), et peut casser des choses (par exemple, un ordinateur MacOS X 10.5 ne pourra pas se connecter au WiFi si son horloge est antérieure à l'an 2000).

  • Emettez le certificat par programme, en utilisant OpenSSL comme une bibliothèque, pas comme un outil de ligne de commande (alternative: modifiez le code source d'OpenSSL pour inclure les options de ligne de commande dont vous avez besoin pour x509 et/ou req).

13
Thomas Pornin

Comme l'a dit Thomas Pornin, la demande de certificat ne contient aucune date, les dates notBefore et notAfter sont définies lorsque le nouveau certificat est créé (signé) par l'autorité de certification.

Si vous utilisez le openssl ca outil, vous pouvez les définir à l'aide de -startdate date et -enddate date options de ligne de commande ou en utilisant default_startdate et default_enddate dans [ca] section du fichier de configuration.

8
Hubert Kario