W przeszłości istnieją dwa sposoby tworzenia certyfikatów. Albo sfałszowanie czasu (1) (2), albo określenie odstępu czasu podczas podpisywania certyfikatu (3).
1) Po pierwsze, o sfałszowaniu czasu: aby jeden program pomyślał, że jest w innym terminie niż system, spójrz libfaketime
ifaketime
Aby zainstalować go w Debianie:
sudo apt-get install faketime
Następnie użyjesz faketime
przed openssl
poleceniem.
Przykłady użycia:
$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
Od man faketime
:
Podane polecenie zostanie oszukane, aby uwierzyć, że bieżący czas systemowy jest zgodny z czasem określonym w znaczniku czasu. Zegar ścienny będzie działał od tej daty i godziny, chyba że określono inaczej (patrz opcje zaawansowane). W rzeczywistości faketime to proste opakowanie dla libfaketime, które wykorzystuje mechanizm LD_PRELOAD do ładowania małej biblioteki, która przechwytuje wywołania systemowe funkcji takich jak time (2) i fstat (2).
Na przykład, w twoim przypadku, możesz bardzo dobrze zdefiniować datę 2008 roku, a następnie stworzyć certyfikat z ważnością od 2 lat do 2010 roku.
faketime '2008-12-24 08:15:42' openssl ...
Na marginesie, narzędzie to może być używane w kilku wersjach Uniksa, w tym MacOS, jako opakowanie dowolnego rodzaju programów (nie tylko w linii poleceń).
Dla wyjaśnienia, tylko pliki binarne załadowane tą metodą (i ich dzieci) mają zmieniony czas, a fałszywy czas nie wpływa na bieżący czas reszty systemu.
2) Jak stwierdza @Wyzard, masz również datefudge
pakiet, który jest bardzo podobny w użyciu faketime
.
Różnice datefudge
nie wpływają fstat
(tzn. Nie zmieniają czasu tworzenia pliku). Ma także własną bibliotekę datefudge.so, którą ładuje przy użyciu LD_PRELOAD.
Ma również miejsce, w -s
static time
którym wskazany czas jest zawsze zwracany, pomimo upływu dodatkowych sekund.
$ datefudge --static "2007-04-01 10:23" sh -c "sleep 3; date -R"
Sun, 01 Apr 2007 10:23:00 +0100
3) Oprócz fałszywego czasu, a nawet prościej, możesz także określić punkt początkowy i końcowy ważności certyfikatu podczas podpisywania certyfikatu w OpenSSL.
Błędne zrozumienie pytania, do którego prowadzi link, polega na tym, że ważność certyfikatu nie jest definiowana w czasie żądania (na żądanie CSR), ale podczas jego podpisywania.
Podczas openssl ca
tworzenia samopodpisanego certyfikatu dodaj opcje -startdate
i-enddate
.
Format daty w tych dwóch opcjach, zgodnie ze źródłami openssl na openssl/crypto/x509/x509_vfy.c
, to ASN1_TIME aka ASN1UTCTime: format musi być RRRMDDGGMMSSZ lub RRRRMMDDGGMMSSZ.
Cytowanie 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("YYMMDDHHMMSSZ") - 1;
static const size_t generalizedtime_length = sizeof("YYYYMMDDHHMMSSZ") - 1;
ASN1_TIME *asn1_cmp_time = NULL;
int i, day, sec, ret = 0;
/*
* Note that ASN.1 allows much more slack in the time format than RFC5280.
* In RFC5280, the representation is fixed:
* UTCTime: YYMMDDHHMMSSZ
* GeneralizedTime: YYYYMMDDHHMMSSZ
*
* We do NOT currently enforce the following RFC 5280 requirement:
* "CAs conforming to this profile MUST always encode certificate
* validity dates through the year 2049 as UTCTime; certificate validity
* dates in 2050 or later MUST be encoded as GeneralizedTime."
*/
I z dziennika ZMIANA (błąd 2038?) - Ten dziennik zmian jest tylko dodatkowym przypisem, ponieważ dotyczy tylko tych, którzy używają bezpośrednio interfejsu API.
Zmiany między 1.1.0e a 1.1.1 [xx XXX xxxx]
*) Dodaj typy ASN.1 INT32, UINT32, INT64, UINT64 i warianty z literą Z. Mają one zastąpić LONG i ZLONG i być bezpieczne pod względem rozmiaru. Używanie LONG i ZLONG jest odradzane i planowane do wycofania w OpenSSL 1.2.0.
Tak więc tworzenie certyfikatu od 1 stycznia 2008 r. Do 1 stycznia 2010 r. Można wykonać jako:
openssl ca -config /path/to/myca.conf -in req.csr -out ourdomain.pem \
-startdate 200801010000Z -enddate 201001010000Z
lub
openssl ca -config /path/to/myca.conf -in req.csr -out ourdomain.pem \
-startdate 0801010000Z -enddate 1001010000Z
-startdate
i -enddate
pojawiają się w openssl
źródłach i dzienniku ZMIANY; jak zauważył @guntbert, chociaż nie pojawiają się na man openssl
stronie głównej , pojawiają się również w man ca
:
-startdate date
this allows the start date to be explicitly set. The format of the date is
YYMMDDHHMMSSZ (the same as an ASN1 UTCTime structure).
-enddate date
this allows the expiry date to be explicitly set. The format of the date is
YYMMDDHHMMSSZ (the same as an ASN1 UTCTime structure).
Cytowanie openssl/CHANGE
:
Zmiany między 0.9.3a a 0.9.4 [09 sierpnia 1999]
*) Napraw argumenty -startdate i -enddate (których brakowało) w programie „ca”.
PS Jeśli chodzi o wybraną odpowiedź na pytanie, na które powołujesz się ze StackExchange: zmiana czasu systemowego jest na ogół złym pomysłem , szczególnie w systemach produkcyjnych; a dzięki metodom opisanym w tej odpowiedzi nie potrzebujesz uprawnień roota podczas ich używania.
datefudge
.faketime
idatefudge
działają pięknie na moim systemie Debiana jessie.Jestem prawie zaskoczony, gdy stwierdziłem, że oczywista rzecz działa: chociaż
openssl
jako argument przyjmuje liczbę dni, przez które certyfikat powinien być ważny, wystarczy podać liczbę ujemną!Zauważ, że w rzeczywistości powoduje to coś bardzo dziwnego: certyfikat, którego znacznik czasu ważności poprzedza znacznik czasu rozpoczęcia ważności. W rzeczywistości nie zalecam używania tego do automatycznego testowania, ponieważ jest to dziwne. Prawdopodobnie potrzebujesz również sposobu na datowanie datownika rozpoczęcia ważności.
źródło
Lub możesz użyć czegoś takiego jak ten krótki program python ... (mają zastosowanie zastrzeżenia)
Tworzy klucz (test.key) i certyfikat (test.crt) z czasem początkowym 10 lat w przeszłości (-10 * 365 * 24 * 60 * 60 sekund to -10 lat) i czasem wygaśnięcia 5 lat w przeszłości (-5 * 365 * 24 * 60 * 60).
Należy pamiętać, że jest to minimalny program demonstracyjny, więc nie zawraca sobie głowy ustawieniem żadnych rozszerzeń (np. BasicConstraints) i używa stałego numeru seryjnego.
źródło