我想动态创建具有任意开始日期和结束日期(包括过去的结束日期)的自签名证书。我更喜欢使用标准工具,例如OpenSSL,但是任何可以完成工作的工具都很棒。
堆栈溢出问题如何生成有效期少于一天的openssl证书?问一个类似的问题,但我希望我的证书是自签名的。
如果您想知道,证书是自动化测试所必需的。
过去有两种创建证书的方法。伪造时间(1)(2),或在签署证书时定义时间间隔(3)。
1)首先,关于伪造的时间:做一个节目觉得是从系统中不同的日期,看看libfaketime
和faketime
要在Debian中安装它:
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年,然后创建一个有效期为2年(到2010年)的证书。
faketime '2008-12-24 08:15:42' openssl ...
附带说明一下,该实用程序可以在包括MacOS在内的多个Unix版本中用作任何程序的包装(不是命令行专用的)。
需要说明的是,只有使用此方法加载的二进制文件(及其子进程)的时间才会更改,伪时间不会影响系统其余部分的当前时间。
2)如@Wyzard所述,您还拥有datefudge
与用法非常相似的软件包faketime
。
作为差异,datefudge
不影响fstat
(即,不更改文件时间的创建)。它还具有自己的库datefudge.so,可以使用LD_PRELOAD进行加载。
它也有一个-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." */
并且来自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中弃用LONG和ZLONG。
因此,创建从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
确实出现在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日]
*)将-startdate和-enddate(缺少)参数固定为“ ca”程序。
PS对于您从StackExchange引用的问题的选择答案:更改系统时间通常是个坏主意,尤其是在生产系统中;并且使用此答案中的方法,您在使用它们时不需要root特权。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句