Создание самоподписанного сертификата с датой окончания в прошлом

Я бы использовал sed :

sed 's/\(.*\)].*\/\(.*$\)/\1,\2/' csv
14/Feb/2016:15:21:33-0500,mk
14/Feb/2016:16:21:33-0500,mk

Где csv - это этот файл:

cat csv 
14/Feb/2016:15:21:33-0500]http://map1.link.de/mk
14/Feb/2016:16:21:33-0500]http://map5.link.de/mk


Пояснение:
\ (. * \)] = search и сохранить каждый символ до первого [
. * \ / = после этого поиск - сделать не сохранить - все до последнего /
\ (. * $ \) = сохранить все, что будет после этого, до конца строки ( mk )
\ 1, \ 2 = заменить на то, что мы сохранили, и добавить запятую между

24
01.09.2017, 22:25
3 ответа

Я почти удивлен тем, что очевидная вещь работает: в то время как openssl принимает в качестве аргумента количество дней, в течение которых сертификат должен быть действителен, просто поставьте отрицательное число!

openssl req -x509 -newkey rsa:4096 \
    -keyout key.pem -out cert.pem -days -365

Обратите внимание, что это приводит к очень странному результату: сертификат, временная метка истечения срока действия которого предшествует его временной метке начала действия. Я не рекомендую использовать это для автоматизированного тестирования, поскольку это странно. Вероятно, вам также нужен способ отменить дату начала срока действия.

10
27.01.2020, 19:41

В прошлом у вас было два способа создания сертификатов. Либо подделка времени (1) (2), либо определение временного интервала при подписании сертификата (3).

1) Во-первых, насчет подделки времени: чтобы одна программа думала, что ее дата отличается от системной, взгляните на libfaketime и faketime

Чтобы установить ее в Debian:

sudo apt-get install faketime

Затем вы должны использовать faketime перед командой openssl .

Примеры использования:

$faketime 'last friday 5 pm' /bin/date
Fri Apr 14 17:00:00 WEST 2017
$faketime '2008-12-24 08:15:42' /bin/date
Wed Dec 24 08:15:42 WET 2008

Из man faketime :

Данная команда будет введена в заблуждение, заставив поверить в то, что Текущий системное время - это время, указанное в метке времени. Настенные часы будут продолжать работать с этой даты и времени, если не указано иное (см. Расширенные опции). На самом деле faketime - это простая оболочка для libfaketime, который использует механизм LD_PRELOAD для загрузки небольшого библиотека, которая перехватывает системные вызовы таких функций, как time (2) и fstat (2).

Так, например, в вашем случае вы можете очень хорошо определить дату 2008, а затем создать сертификат со сроком действия 2 года до 2010 года.

faketime '2008-12-24 08:15:42' openssl ... 

Кстати, эту утилиту можно использовать в нескольких версиях Unix, включая MacOS, в качестве оболочки для любых программ (не только для командной строки).

В качестве пояснения, время изменено только для двоичных файлов, загруженных с помощью этого метода (и их потомков), и фиктивное время не влияет на текущее время остальной системы.

2) Как заявляет @Wyzard, у вас также есть пакет datefudge , который очень похож по использованию на faketime .

В отличие от datefudge не влияет на fstat (т.е. не меняет время создания файла). У него также есть собственная библиотека datefudge.so, которую он загружает с помощью LD_PRELOAD.

Он также имеет статическое время -s , где всегда возвращается указанное время, несмотря на то, сколько дополнительных секунд прошло.

$ datefudge --static "2007-04-01 10:23" sh -c "sleep 3; date -R"
Sun, 01 Apr 2007 10:23:00 +0100

3) Помимо подделки времени, и даже проще, вы также можете определить начальную и конечную точки действия сертификата, когда подписывает сертификат в OpenSSL.

Заблуждение относительно вопроса, на который вы ссылаетесь в своем вопросе, заключается в том, что срок действия сертификата определяется не во время запроса (в запросе CSR), а при его подписании.

При использовании openssl ca для создания самозаверяющего сертификата добавьте параметры -startdate и -enddate .

Формат даты в этих двух вариантах, согласно источникам openssl на openssl / crypto / x509 / x509_vfy.c , - ASN1_TIME, он же ASN1UTCTime: формат должен быть либо YYMMDDHHMMSSZ, либо YYYYMMDZH.

Цитата openssl / crypto / x509 / x509_vfy.c :

 int X509_cmp_time (const ASN1_TIME * ctm, time_t * cmp_time)
{
static const size_t utctime_length = sizeof ("ГГММДДЧЧММССЗ") - 1;
static const size_t generalizedtime_length = sizeof ("ГГГГММДДЧЧММССЗ") - 1;
ASN1_TIME * asn1_cmp_time = NULL;
int i, день, сек, ret = 0;

 / *
 * Обратите внимание, что ASN.1 допускает гораздо больший резерв времени в формате времени, чем RFC5280.
 * В RFC5280 представление фиксировано:
 * UTCTime: ГГММДДЧЧММССЗ
 * GeneralizedTime: ГГГГММДДЧЧММССЗ
 *
 * В настоящее время мы НЕ применяем следующие требования RFC 5280:
 * "Центры сертификации, соответствующие этому профилю, ДОЛЖНЫ всегда кодировать сертификат.
 * срок действия до 2049 года в формате UTCTime; срок действия сертификата
 * даты в 2050 году или позже ДОЛЖНЫ быть закодированы как GeneralizedTime. "
 * /

И из журнала ИЗМЕНЕНИЙ (ошибка 2038?) - Этот журнал изменений является дополнительной сноской, поскольку касается только тех, кто напрямую использует API.

Изменения между 1.1.0e и 1.1.1 [xx XXX xxxx]

*) Добавьте типы ASN.1 INT32, UINT32, INT64, UINT64 и варианты с префиксом с Z. Они предназначены для замены LONG и ZLONG и обеспечения безопасного размера. Использование LONG и ZLONG не рекомендуется, и их поддержка запланирована на прекращение. в OpenSSL 1.2.0.

Таким образом, создание сертификата с 1 января 2008 года по 1 января 2010 года может быть выполнено как:

openssl ca -config /path/to/myca.conf -in req.csr -out ourdomain.pem \
-startdate 200801010000Z -enddate 201001010000Z

или

openssl ca -config /path/to/myca.conf -in req.csr -out ourdomain.pem \
-startdate 0801010000Z -enddate 1001010000Z

-startdate и -enddate действительно появляются в исходниках openssl и журнале ИЗМЕНЕНИЙ; как отметил @guntbert, хотя они не отображаются на главной странице man openssl , они также появляются в man ca :

 -startdate date
это позволяет явно установить дату начала. Формат даты:
ГГММДДЧЧММССЗ (то же, что и структура ASN1 UTCTime).

 -конечная дата
это позволяет явно установить дату истечения срока годности. Формат даты:
ГГММДДЧЧММССЗ (то же, что и структура ASN1 UTCTime).

Цитата openssl / CHANGE :

Изменения между 0.9.3a и 0.9.4 [09 августа 1999]

*) Исправьте аргументы -startdate и -enddate (которые отсутствовали) для ' ca ' программа.

P.S. Что касается выбранного ответа на вопрос , который вы ссылаетесь на StackExchange: обычно плохая идея изменять системное время, особенно в производственных системах; и с методами в этом ответе вам не нужны привилегии root при их использовании.

39
27.01.2020, 19:41

Или вы можете использовать что-то вроде этой короткой программы python ...

Она создает ключ (test.key) и сертификат (test.crt) с временем начала действия 10 лет назад (-10*365*24*60*60 секунд - это -10 лет) и временем истечения действия 5 лет назад (-5*365*24*60*60).

Обратите внимание, что это минимальная демонстрационная программа, поэтому она не утруждает себя установкой каких-либо расширений, (например, basicConstraints) и использует фиксированный серийник.

#!/usr/bin/env python

from OpenSSL import crypto

key = crypto.PKey()
key.generate_key(crypto.TYPE_RSA, 2048)
cert = crypto.X509()
cert.get_subject().CN = "Test"
cert.set_serial_number(666)
cert.gmtime_adj_notBefore(-10*365*24*60*60)
cert.gmtime_adj_notAfter(-5*365*24*60*60)
cert.set_issuer(cert.get_subject())
cert.set_pubkey(key)
cert.sign(key, 'sha384')

open("test.crt", "wb").write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))
open("test.key", "wb").write(crypto.dump_privatekey(crypto.FILETYPE_PEM, key))
4
27.01.2020, 19:41

Теги

Похожие вопросы