종료 날짜가 과거인 자체 서명된 인증서 만들기

종료 날짜가 과거인 자체 서명된 인증서 만들기

종료 날짜를 포함하여 임의의 시작 날짜와 종료 날짜를 사용하여 즉시 자체 서명된 인증서를 만들고 싶습니다.과거. 저는 OpenSSL과 같은 표준 도구를 사용하는 것을 선호하지만 작업을 완료할 수 있는 도구라면 무엇이든 좋습니다.

스택 오버플로 질문만료일이 하루 미만인 openssl 인증서를 생성하는 방법은 무엇입니까?비슷한 질문을 하지만 내 인증서가 자체 서명되기를 원합니다.

궁금한 점이 있으시면 자동화된 테스트를 위해 인증서가 필요합니다.

답변1

과거에는 인증서를 만드는 데 두 가지 방법이 있었습니다. 시간을 위조하거나(1)(2), 인증서에 서명할 때 시간 간격을 정의합니다(3).

1) 첫째, 시간을 속이는 방법: 한 프로그램이 시스템과 다른 날짜에 있다고 생각하게 하려면 다음을 살펴 libfaketime보고faketime

데비안에 설치하려면:

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년으로 정의하고 2010년까지 2년 동안 유효한 인증서를 생성할 수 있습니다.

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

참고로, 이 유틸리티는 MacOS를 포함한 여러 Unix 버전에서 모든 종류의 프로그램(명령줄 전용이 아님)에 대한 래퍼로 사용할 수 있습니다.

명확히 말하면, 이 메서드(및 해당 자식)로 로드된 바이너리만 시간이 변경되며 가짜 시간은 시스템의 나머지 부분의 현재 시간에 영향을 주지 않습니다.

2) @Wyzard가 말했듯 datefudgefaketime.

차이점은 datefudge영향을 미치지 않습니다 fstat(즉, 파일 생성 시간을 변경하지 않음). 또한 LD_PRELOAD를 사용하여 로드하는 자체 라이브러리 datefudge.so도 있습니다.

-s static time또한 몇 초가 더 지났는지에도 불구하고 참조된 시간이 항상 반환되는 기능도 있습니다 .

$ 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.cASN1_TIME(일명 ASN1UTCTime)입니다. 형식은 YYMMDDHHMMSSZ 또는 YYYYMMDDHHMMSSZ여야 합니다.

인용 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."
     */

그리고 CHANGE 로그(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에서는 더 이상 사용되지 않을 예정입니다.

따라서 2008년 1월 1일부터 2010년 1월 1일까지 인증서를 생성하는 방법은 다음과 같습니다.

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소스와 CHANGE 로그 에 나타 -enddate납니다 . openssl@guntbert가 언급했듯이 기본 페이지에는 표시되지 않지만 man openssl다음에도 표시됩니다 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).

인용 openssl/CHANGE:

0.9.3a와 0.9.4 사이의 변경 사항 [1999년 8월 9일]

*) 'ca' 프로그램에 대한 -startdate 및 -enddate(누락된) 인수를 수정합니다.

추신: 선택한 답변에 관해서는질문StackExchange에서 참조합니다. 일반적으로나쁜 생각특히 프로덕션 시스템에서 시스템 시간을 변경합니다. 이 답변의 방법을 사용하면 루트 권한이 필요하지 않습니다.

답변2

나는 명백한 일이 작동한다는 사실에 거의 놀랐습니다. openssl인증서가 유효해야 하는 일수를 인수로 사용하는 반면 음수만 제공하면 됩니다!

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

실제로 이로 인해 매우 이상한 결과가 발생합니다. 즉, 만료 타임스탬프가 있는 인증서입니다.선행하다유효 기간 시작 타임스탬프입니다. 나는 실제로 이것을 자동화된 테스트에 사용하는 것을 권장하지 않습니다. 이상하기 때문입니다. 유효 기간 시작 타임스탬프의 날짜를 소급하는 방법도 원할 것입니다.

답변3

아니면 이 짧은 Python 프로그램과 같은 것을 사용할 수도 있습니다... (주의사항 적용)

시작 시간이 10년 전(-10*365*24*60*60초는 -10년)이고 만료 시간이 5년 전인 키(test.key)와 인증서(test.crt)를 생성합니다. (-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

1 단계.페이크타임 설치

sudo apt-get install faketime

2 단계.현재 날짜 하루 전에 만료된 인증서를 생성합니다.

faketime 'last friday 5 pm' /bin/bash -c 'openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 6 -nodes'

3단계인증서 유효기간을 확인하세요

openssl x509 -noout -text -in cert.pem

인증서 유효 기간 - 스크린샷

관련 정보