다음을 포함하여 임의의 시작 및 종료 날짜를 사용하여 자체 서명된 인증서를 동적으로 생성하고 싶습니다.과거. 저는 OpenSSL과 같은 표준 도구를 사용하는 것을 선호하지만 작업을 완료하는 도구라면 무엇이든 좋습니다.
스택 오버플로 질문유효 기간이 1일 미만인 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은 LD_PRELOAD 메커니즘을 사용하여 time(2) 및 fstat(2)와 같은 함수에 대한 시스템 호출을 가로채는 작은 라이브러리를 로드하는 libfaketime의 간단한 래퍼입니다.
예를 들어, 귀하의 경우 날짜를 2008년으로 정의한 다음 2010년까지 2년 동안 유효한 인증서를 생성할 수 있습니다.
faketime '2008-12-24 08:15:42' openssl ...
참고로 이 유틸리티는 MacOS를 포함한 여러 Unix 버전에서 모든 종류의 프로그램(명령줄에 국한되지 않음)에 대한 래퍼로 사용할 수 있습니다.
명확히 하자면, 이 방법을 사용하여 로드된 바이너리(및 해당 하위 파일)의 시간만 변경되며 가짜 시간은 나머지 시스템의 현재 시간에 영향을 미치지 않습니다.
2) @Wyzard가 말했듯 datefudge
이 faketime
.
차이로 인해 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.c
ASN1_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." */
변경 로그(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
-enddate
@guntbert가 지적했듯이 소스와 변경 로그 에는 표시되지만 홈페이지 openssl
에는 표시되지 않지만 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(누락) 매개변수를 수정합니다.
PS 선택한 답변은질문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년)이고 만료 시간이 과거인 키(test.key)와 인증서(test.crt)를 생성합니다. 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))