Bạn có hai cách tạo chứng chỉ trong quá khứ. Hoặc giả mạo thời gian (1) (2) hoặc xác định khoảng thời gian khi ký chứng chỉ (3).
1) Thứ nhất, về việc giả mạo thời gian: để làm cho một chương trình nghĩ rằng đó là một ngày khác với hệ thống, hãy xem libfaketime
vàfaketime
Để cài đặt nó trong Debian:
sudo apt-get install faketime
Sau đó, bạn sẽ sử dụng faketime
trướcopenssl
lệnh.
Ví dụ về việc sử dụng:
$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
Từ man faketime
:
Lệnh đã cho sẽ bị lừa tin rằng thời gian hệ thống hiện tại là thời gian được chỉ định trong dấu thời gian. Đồng hồ treo tường sẽ tiếp tục chạy từ ngày và giờ này trừ khi được chỉ định khác (xem các tùy chọn nâng cao). Trên thực tế, faketime là một trình bao bọc đơn giản cho libfaketime, sử dụng cơ chế LD_PRELOAD để tải một thư viện nhỏ chặn các cuộc gọi hệ thống đến các chức năng như thời gian (2) và fstat (2).
Vì vậy, ví dụ, trong trường hợp của bạn, bạn có thể xác định rất rõ ngày tháng năm 2008 và tạo chứng chỉ có hiệu lực trong 2 năm cho đến năm 2010.
faketime '2008-12-24 08:15:42' openssl ...
Là một lưu ý phụ, tiện ích này có thể được sử dụng trong một số phiên bản Unix, bao gồm MacOS, như một trình bao bọc cho bất kỳ loại chương trình nào (không dành riêng cho dòng lệnh).
Để làm rõ, chỉ có các tệp nhị phân được tải bằng phương thức này (và con cái của chúng) có thời gian thay đổi và thời gian giả không ảnh hưởng đến thời gian hiện tại của phần còn lại của hệ thống.
2) Như @Wyzard tuyên bố, bạn cũng có datefudge
gói sử dụng rất giống với faketime
.
Như sự khác biệt, datefudge
không ảnh hưởng fstat
(tức là không thay đổi thời gian tạo tập tin). Nó cũng có thư viện riêng của nó, datefudge.so, nó tải bằng LD_PRELOAD.
Nó cũng có một -s
static time
thời gian mà thời gian được tham chiếu luôn được trả về mặc dù đã thêm bao nhiêu giây nữa.
$ datefudge --static "2007-04-01 10:23" sh -c "sleep 3; date -R"
Sun, 01 Apr 2007 10:23:00 +0100
3) Bên cạnh việc giả mạo thời gian và thậm chí đơn giản hơn, bạn cũng có thể xác định điểm bắt đầu và điểm kết thúc hiệu lực của chứng chỉ khi ký chứng chỉ trong OpenSSL.
Quan niệm sai lầm về câu hỏi bạn liên kết đến trong câu hỏi của bạn, đó là tính hợp lệ của chứng chỉ không được xác định tại thời điểm yêu cầu (tại yêu cầu CSR), nhưng khi ký tên.
Khi sử dụng openssl ca
để tạo chứng chỉ tự ký, hãy thêm các tùy chọn -startdate
và -enddate
.
Định dạng ngày trong hai tùy chọn đó, theo các nguồn openssl tại openssl/crypto/x509/x509_vfy.c
, là ASN1_TIME hay còn gọi là ASN1UTCTime: định dạng phải là YYMMDDHHMMSSZ hoặc YYYYMMDDHHMMSSZ.
Trích dẫn 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."
*/
Và từ nhật ký CHANGE (lỗi 2038?) - Nhật ký thay đổi này chỉ là một chú thích bổ sung, vì nó chỉ liên quan đến những người sử dụng trực tiếp API.
Thay đổi giữa 1.1.0e và 1.1.1 [xx XXX xxxx]
*) Thêm các loại ASN.1 INT32, UINT32, INT64, UINT64 và các biến thể có tiền tố Z. Chúng có nghĩa là thay thế LONG và ZLONG và để có kích thước an toàn. Việc sử dụng LONG và ZLONG không được khuyến khích và lên kế hoạch cho việc phản đối trong OpenSSL 1.2.0.
Vì vậy, việc tạo chứng chỉ từ ngày 1 tháng 1 năm 2008 đến ngày 1 tháng 1 năm 2010, có thể được thực hiện như sau:
openssl ca -config /path/to/myca.conf -in req.csr -out ourdomain.pem \
-startdate 200801010000Z -enddate 201001010000Z
hoặc là
openssl ca -config /path/to/myca.conf -in req.csr -out ourdomain.pem \
-startdate 0801010000Z -enddate 1001010000Z
-startdate
và -enddate
xuất hiện trong các openssl
nguồn và nhật ký THAY ĐỔI; như @guntbert lưu ý, trong khi chúng không xuất hiện trên man openssl
trang chính , chúng cũng xuất hiện trong 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).
Trích dẫn openssl/CHANGE
:
Thay đổi giữa 0.9.3a và 0.9.4 [09 tháng 8 năm 1999]
*) Khắc phục các đối số -startdate và -enddate (đã bị thiếu) cho chương trình 'ca'.
PS Đối với câu trả lời được chọn của câu hỏi mà bạn tham khảo từ StackExchange: nói chung là một ý tưởng tồi để thay đổi thời gian hệ thống, đặc biệt là trong các hệ thống sản xuất; và với các phương thức trong câu trả lời này, bạn không cần quyền root khi sử dụng chúng.