Cómo establecer el valor "No antes" en pasado cuando se crea una solicitud de certificado

15

Tenemos muchos clientes TLS integrados en el campo. Los servidores TLS deben estar autenticados.

Debido a que los cortes de energía prolongados pueden restablecer el reloj de esos dispositivos, tenemos el requisito de utilizar certificados con un período de validez: desde 19700101000001Z hasta 99991231235959Z.

¿Cómo usar openssl para crear solicitudes de certificado con ese tipo de período de validez?

Solo encuentro la opción -days para establecer el período, y eso no es suficiente.

    
pregunta SKi 27.02.2013 - 14:05
fuente

2 respuestas

13

El final del período de validez "99991231235959Z" puede ocasionarle problemas, ya que algunos programas aún convierten la fecha en una representación interna como un número de segundos desde la "Época" (1 de enero de 1970, 00:00 UTC) en una entero de 32 bits con signo . Esta representación interna falla en enero de 2038 . Establecer un período de validez que se extienda más allá de esa fecha fatídica puede implicar que algunas implementaciones rechacen sus certificados.

Además, cuando un dispositivo ve que su reloj se reinicia debido a un largo corte de energía, supongo que no se reinicia a una fecha aleatoria; se restablece a una fecha "predeterminada". La validez de su certificado no tiene que cubrir ocho mil años, sino "solo" los días actuales (para dispositivos con un reloj bien ajustado) y los días alrededor del valor predeterminado a los que los relojes se reinician cuando pierden energía. Establecer el período de validez en el rango de 1970 a, por ejemplo, 2037, debería cubrir todos los casos, y mantendrá la representación interna (si es utilizada por una implementación específica) en el rango donde la aritmética con signo de 32 bits es buena.

Tenga en cuenta que si sus dispositivos no tienen un reloj preciso, no tendrá soporte confiable para revocación , a menos que aplique OCSP con nonce de cliente.

Dicho esto, el período de validez no es parte de la solicitud de certificado . El período se elige en el momento en que el CA emite el certificado.

La herramienta de línea de comandos OpenSSL se puede usar como una AC muy burda, aunque se diseñó principalmente para la depuración. Esa herramienta ofrece "comandos", dos de los cuales pueden crear un certificado X.509, x509 y req . Ambos proporcionan solo una opción para ajustar el período de validez, que es la opción -days . Esto se ve claramente si echa un vistazo al código fuente , por ejemplo. en 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);

Como se ve en este fragmento de código, se crea la nueva estructura de certificado X.509, (y establece por defecto el inicio y el final del período de validez hasta la fecha actual); las dos últimas líneas del código ajustan el período de validez utilizando el parámetro days , y nada más .

Entonces, si desea ajustar el período de validez a fechas arbitrarias, tiene dos posibilidades:

  • Establezca la fecha actual de su computadora en la fecha de inicio que desea usar, de modo que openssl crea que realmente estamos a principios de la década de 1970; y establece -days a 24000 o menos. Este es un truco horrible y volver a configurar el reloj de su computadora en el pasado pre-Disco (las computadoras modernas configuran automáticamente su reloj con NTP ), y puede romper cosas (por ejemplo, una computadora MacOS X 10.5 no podrá conectarse a WiFi si su reloj es anterior al año 2000).

  • Emita el certificado mediante programación, utilizando OpenSSL como biblioteca , no como herramienta de línea de comandos (alternativa: modifique el código fuente de OpenSSL para incluir las opciones de línea de comandos que necesita para x509 y / o req ).

respondido por el Thomas Pornin 27.02.2013 - 14:50
fuente
8

Como dijo Thomas Pornin, la solicitud de certificado no contiene ninguna fecha, las fechas notBefore y notAfter se establecen cuando el CA crea el nuevo certificado (firmado)

Si usa la herramienta openssl ca , puede configurarlos usando las opciones de línea de comando -startdate date y -enddate date o usando default_startdate y default_enddate en la sección [ca] del archivo de configuración.

    
respondido por el Hubert Kario 15.07.2013 - 15:49
fuente

Lea otras preguntas en las etiquetas