Geçmişte bitiş tarihi olan kendinden imzalı sertifika oluşturma


24

Geçmişte bitiş tarihleri ​​de dahil olmak üzere, keyfi başlangıç ​​ve bitiş tarihlerini içeren anında kendinden imzalı sertifikalar oluşturmak istiyorum . OpenSSL gibi standart araçları kullanmayı tercih ederim, ancak işi yapan her şey harika olurdu.

Yığın Taşması sorusu Bir günden daha kısa bir sürede sona ermesi ile openssl sertifikası nasıl oluşturulur? benzer bir soru sorar, ancak sertifikamın kendinden imzalı olmasını istiyorum.

Merak ediyorsanız, otomatik testler için sertifikalara ihtiyaç duyulur.

Yanıtlar:


32

Geçmişte sertifika oluşturmanın iki yolu vardır. Ya (1) (2) numaralı numaraya, ya da sertifikayı (3) imzalarken zaman aralığının tanımlanması.

1) İlk olarak, zaman yalan hakkında: bir program sistemden farklı bir tarihte olduğunu düşünüyorum yapmak bir göz için libfaketimevefaketime

Debian'da kurmak için:

sudo apt-get install faketime

Daha sonra komuttan faketimeönce kullanırsınız openssl.

Kullanım örnekleri için:

$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

Kimden man faketime:

Verilen komut, mevcut sistem zamanının zaman damgasında belirtilen zaman olduğuna inanmak için kandırılacak. Duvar saati, aksi belirtilmedikçe bu tarih ve saatten çalışmaya devam eder (bkz. Gelişmiş seçenekler). Aslında, faketime, libfaketime için, zaman zaman (2) ve fstat (2) gibi işlev çağrılarına sistem çağrılarına müdahale eden küçük bir kütüphaneyi yüklemek için LD_PRELOAD mekanizmasını kullanan basit bir sarıcıdır.

Örneğin, sizin durumunuzda, 2008 tarihini çok iyi tanımlayabilir ve daha sonra 2010 yılına kadar 2 yıl geçerliliği olan bir sertifika oluşturabilirsiniz.

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

Bir yandan not olarak, bu yardımcı program MacOS dahil olmak üzere birçok Unix sürümünde, her türlü programa (komut satırına özel değil) sarıcı olarak kullanılabilir.

Bir açıklama olarak, yalnızca bu yöntemle (ve onların çocuklarıyla) yüklenen ikili dosyalar zamanlarını değiştirmiştir ve sahte zaman sistemin geri kalanının o andaki zamanını etkilememektedir.

2) @Wyzard'ın belirttiği gibi, datefudgekullanımda çok benzer bir pakete sahipsin faketime.

Farklılıklar olarak, datefudgeetkilemez fstat(yani, dosya zamanı oluşturulmasını değiştirmez). Ayrıca LD_PRELOAD kullanarak yüklenen kendi datefudge.so kütüphanesine sahiptir.

Ayrıca -s static timekaç saniye geçmesine rağmen başvurulan zamanın her zaman geri döndürüldüğü bir yere sahiptir .

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

3) OpenSSL'de sertifikayı imzalarken zamana ve hatta daha basit bir şekilde, sertifikanın başlangıç ​​ve bitiş geçerlilik noktalarını tanımlayabilirsiniz .

Sorunuzda bağladığınız sorunun yanlış anlaşılması, sertifika geçerliliğinin istek anında (CSR isteğinde) değil, imzalanırken tanımlandığı şeklindedir.

Kullanırken openssl caotomatik olarak imzalanan sertifika oluşturmak için, seçenekler eklemek -startdateve -enddate.

openssl/crypto/x509/x509_vfy.cOpenssl kaynaklarına göre, bu iki seçenekdeki tarih formatı ASN1_TIME aka ASN1UTCTime: format ya YYMMDDHHMMSSZ ya da YYYYMMDDHHMMSSZ olmalıdır.

Alıntı yapmak 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."
     */

Ve CHANGE günlüğünden (2038 hata?) - Bu değişiklik günlüğü, yalnızca doğrudan API kullananları ilgilendirdiği için ek bir dipnot gibidir.

1.1.0e ve 1.1.1 arasındaki değişiklikler [xx XXX xxxx]

*) ASN.1 INT32, UINT32, INT64, UINT64 tiplerini ve Z ile önceden belirlenmiş varyantlarını ekleyin. LONG ve ZLONG'un kullanımı önerilmez ve OpenSSL 1.2.0'da kullanımdan kaldırılması planlanmaktadır.

Böylece 1 Ocak 2008'den 1 Ocak 2010'a kadar bir sertifika oluşturmak şöyle yapılabilir:

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

veya

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

-startdateve kaynaklarda ve CHANGE günlüğünde -enddatebelirir openssl; @guntbert'in belirttiği gibi, ana man opensslsayfada görünmemekle birlikte, bunlar da şöyle görünür 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).

Alıntı yapmak openssl/CHANGE:

0.9.3a ile 0.9.4 arasındaki değişiklikler [09 Ağu 1999]

*) 'Ca' programına -startdate ve -enddate (eksik olan) argümanlarını düzeltin.

PS StackExchange'ten referans aldığınız sorunun seçilen cevabı gelince : genellikle üretim sistemlerinde sistem saatini değiştirmek genellikle kötü bir fikirdir ; ve bu cevaptaki yöntemlerle, bunları kullanırken kök izinlerine ihtiyacınız yoktur.


1
+1. Birinin yazdığımdan daha iyi bir şeyle geleceğini biliyordum :)
Celada

2
Ayrıca benzer bir program var datefudge.
Wyzard

@Wyzard Teşekkürler, gerçekten Debian'da buldum; İlginçtir ki, el kitabı sistem çağrılarını zaman (2) gibi fonksiyonlara değiştirirken, fstat'ı (2) etkilemediğini belirtir.
Rui F Ribeiro

1
Her ikisi de faketimeve datefudgeDebian jessie sistemimde güzel çalışıyor.
rlandster

1
OTOH: Bu tarihleri nereye koyacağınızı bulmak için +5 !
guntbert

8

Belirgin olan şeyin işe yaradığını bulmaya neredeyse şaşırdım: opensslargüman olarak sertifikanın geçerli olacağı gün sayısını tartışırken, sadece negatif bir sayı girin!

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

Bunun gerçekten çok garip bir şeyle sonuçlandığına dikkat edin: son kullanma tarihi damgası geçerlilik başlangıcı zaman damgasından önce gelen bir sertifika . Bunu garip olduğu için otomatik testlerinizde kullanmanızı tavsiye etmiyorum. Muhtemelen, geçerlilik başlangıcı zaman damgasını da geri bildirmenin bir yolunu bulmalısınız.


Adil olmak gerekirse, olumsuz günleri kullanabileceğinizi bilmiyordum.
Rui F Ribeiro

Başlangıç ​​tarihi belirtemez misiniz?
ÜcretsizYazılımServisler

@FreeSoftwareServers CSR'de yapamazsınız; cevabımın son bölümünü gör.
Rui F Ribeiro

Daha enteresan bir şekilde, kod barf bu sertifikayı bulamaz mı? btw, cevabımı genişlettim
Rui F Ribeiro

3

Veya bu kısa python programı gibi bir şey kullanabilirsiniz ... (uyarılar uygulanır)

Geçmişte 10 yıl (-10 * 365 * 24 * 60 * 60 saniye -10 yıldır) ve son kullanma süresi 5 yıl olan bir anahtar (test.key) ve bir sertifika (test.crt) oluşturur. (-5 * 365 * 24 * 60 * 60).

Lütfen asgari bir gösteri programı olduğuna dikkat edin, bu nedenle herhangi bir uzantı (örneğin basicConstraints) ayarlamak zahmetine girmez ve sabit seri kullanır.

#!/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))

Kod, gerekli X.509 standart alanları eksik gibi görünüyor.
Rui F Ribeiro

2
Bu çok yardımcı. Sertifika oluşturma üzerinde daha kolay programatik kontrol sağlıyor.
rlandster
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.