Come impostare il valore "Not Before" in passato quando si crea una richiesta di certificato

15

Abbiamo molti clienti TLS incorporati sul campo. I server TLS devono essere autenticati.

Poiché lunghe interruzioni di corrente possono reimpostare il clock di tali dispositivi, abbiamo bisogno di utilizzare certificati con periodo di validità: da 19700101000001Z a 99991231235959Z.

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

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

    
posta SKi 27.02.2013 - 14:05
fonte

2 risposte

13

Il periodo di validità di "99991231235959Z" può farti finire nei guai, perché alcuni software convertono ancora la data in una rappresentazione interna come un numero di secondi da "Epoch" (1 gennaio 1970, 00:00 UTC) su un numero intero a 32 bit firmato. Questa rappresentazione interna non riesce su gennaio 2038 . L'impostazione di un periodo di validità che si estende oltre tale data fatale può implicare che i certificati vengano rifiutati da 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 correnti (per i dispositivi con un orologio ben regolato) e i giorni attorno al valore predefinito a cui gli orologi vengono ripristinati quando perdono energia. Impostare il periodo di validità tra il 1970 e il 2037, dovrebbe coprire tutti i casi e manterrà la rappresentazione interna (se utilizzata da un'implementazione specifica) nell'intervallo in cui l'aritmetica con firma a 32 bit è buona.

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

Detto questo, il periodo di validità è non parte della richiesta di certificato . Il periodo è scelto nel momento in cui viene emesso il certificato, dalla CA.

Lo strumento da riga di comando OpenSSL può essere utilizzato come CA molto grezzo, sebbene sia stato progettato principalmente 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à, che è l'opzione -days . Questo è abbastanza chiaramente visibile se dai un'occhiata al 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 si vede in questo snippet di codice, viene creata la nuova struttura di certificato X.509, (e imposta l'inizio e la fine del periodo di validità alla data corrente); le ultime due righe del codice regolano il periodo di validità utilizzando il parametro days , e nient'altro .

Quindi, se vuoi regolare il periodo di validità in 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 su 24000 circa. Questo è un tremendo trucco e l'impostazione dell'orologio del computer nel passato precedente al Disco potrebbe essere difficile (i computer moderni impostano automaticamente il proprio orologio con NTP ), e potrebbe rompere cose (ad esempio un computer MacOS X 10.5 non sarà in grado di connettersi a WiFi se il suo orologio è prima dell'anno 2000).

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

risposta data 27.02.2013 - 14:50
fonte
8

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

Se si utilizza lo strumento openssl ca , è possibile impostarli utilizzando le opzioni della riga di comando -startdate date e -enddate date o utilizzando default_startdate e default_enddate nella sezione [ca] del file di configurazione.

    
risposta data 15.07.2013 - 15:49
fonte

Leggi altre domande sui tag