Я бы использовал 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
= заменить на то, что мы сохранили, и добавить запятую между
Я почти удивлен тем, что очевидная вещь работает: в то время как openssl
принимает в качестве аргумента количество дней, в течение которых сертификат должен быть действителен, просто поставьте отрицательное число!
openssl req -x509 -newkey rsa:4096 \
-keyout key.pem -out cert.pem -days -365
Обратите внимание, что это приводит к очень странному результату: сертификат, временная метка истечения срока действия которого предшествует его временной метке начала действия. Я не рекомендую использовать это для автоматизированного тестирования, поскольку это странно. Вероятно, вам также нужен способ отменить дату начала срока действия.
В прошлом у вас было два способа создания сертификатов. Либо подделка времени (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 при их использовании.
Или вы можете использовать что-то вроде этой короткой программы 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))