it-swarm.dev

Come impostare il valore "Not Before" su passato durante la creazione della richiesta di certificato

Abbiamo molti client TLS integrati sul campo. I server TLS devono essere autenticati.

Poiché lunghe interruzioni di corrente possono ripristinare il clock di tali dispositivi, è necessario utilizzare i certificati con un periodo di validità: da 19700101000001Z a 9999123123595959Z.

Come usare openssl per creare richieste di certificati con quel tipo di periodo di validità?

Trovo solo il -days opzione per l'impostazione del periodo e non è sufficiente.

15
SKi

La fine del periodo di validità "99991231235959Z" potrebbe causare problemi, poiché alcuni software convertono ancora la data in una rappresentazione interna in un numero di secondi dopo "Epoca" (1 gennaio 1970, 00:00 UTC) su a a 32 bit con segno. Questa rappresentazione interna non riesce il gennaio 2038 . L'impostazione di un periodo di validità che va oltre quella fatidica data può comportare il rifiuto dei certificati da parte di alcune implementazioni.

Inoltre, quando un dispositivo vede il suo orologio resettato a causa di una lunga interruzione di corrente, suppongo che non venga ripristinato a una data casuale; viene ripristinato a una data "predefinita". La validità del certificato non deve coprire ottomila anni, ma "solo" i giorni attuali (per i dispositivi con un orologio ben regolato) e i giorni intorno al valore predefinito a cui vengono ripristinati gli orologi quando perdono energia. L'impostazione del periodo di validità tra il 1970 e, per esempio, il 2037, dovrebbe coprire tutti i casi e manterrà la rappresentazione interna (se utilizzata da un'implementazione specifica) nell'intervallo in cui l'aritmetica firmata a 32 bit è buona.

Tieni presente che se i tuoi dispositivi non dispongono di un orologio preciso, non avrai un supporto affidabile di revoca , a meno che non imposti OCSP con client nonces.


Detto questo, il periodo di validità è non parte del richiesta di certificato . Il periodo viene scelto al momento dell'emissione del certificato, da parte della CA.

strumento da riga di comando OpenSSL può essere usato come una CA molto grezza, sebbene sia stato principalmente progettato per il debug. Questo strumento offre "comandi", due dei quali sono in grado di creare un certificato X.509, x509 e req . Entrambi forniscono solo un'opzione per regolare il periodo di validità, ovvero -days opzione. Questo è chiaramente visibile se dai un'occhiata a codice sorgente , ad es. in 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);

Come vedi in questo frammento di codice, viene creata la nuova struttura del certificato X.509 (e imposta automaticamente l'inizio e la fine del periodo di validità alla data corrente); le ultime due righe del codice regolano il periodo di validità usando il parametro days, e nient'altro.

Quindi, se vuoi adattare il periodo di validità a date arbitrarie, hai due possibilità:

  • Imposta la data corrente del tuo computer sulla data di inizio che desideri utilizzare, in modo che openssl creda che siamo davvero nei primi anni '70; e imposta -days a 24000 o giù di lì. Questo è un terribile hack e ripristinare l'orologio del tuo computer nel passato pre-Disco potrebbe essere difficile (i computer moderni impostano automaticamente l'orologio con NTP ), e potrebbe rompere le cose (ad esempio un computer MacOS X 10.5 non sarà in grado di connettersi al WiFi se il suo orologio è precedente all'anno 2000).

  • Emetti il ​​certificato a livello di codice, usando OpenSSL come libreria, non come strumento da riga di comando (in alternativa: modifica il codice sorgente OpenSSL per includere le opzioni da riga di comando necessarie per x509 e/o req).

13
Thomas Pornin

Come ha affermato Thomas Pornin, la richiesta di certificato non contiene alcuna data, le date notBefore e notAfter vengono impostate quando il nuovo certificato viene creato (firmato) dalla CA.

Se usi openssl ca strumento, puoi impostarli usando -startdate date e -enddate date opzioni della riga di comando o usando default_startdate e default_enddate in [ca] sezione del file di configurazione.

8
Hubert Kario