如何正确设置openssl
的选项-dateopt
?
生成自签名证书的示例:
openssl req
-x509
-days 10
-nodes
-newkey rsa:2048
-keyout "$PWD/self.key"
-out "$PWD/self.crt"
-subj "/C=US/ST=STATE/L=CITY/O=ORG_NAME/OU=OU_NAME/CN=CN_OR_FQDN_OR_SERVER_NAME"
在当前目录中给我两个文件:
self.key
self.crt
检查self.crt
i运行的结束日期:
openssl x509 -enddate -noout -in "$PWD/self.crt"
返回正确的结果:
notAfter=10月4日16:05:59 2022 GMT
但如果我使用-dateopt
交换机文档:
-dateopt。指定日期输出格式。值为:rfc_822和iso_8601。默认值为rfc_822。
这种方式:
openssl x509 -enddate -dateopt iso_8601 -noout -in "$PWD/self.crt"
我得到错误(ec=1(:
无效的日期格式:iso_8601
也许原因就在这几行附近:
case OPT_DATEOPT:
if (!set_dateopt(&dateopt, opt_arg())) {
BIO_printf(bio_err,
"Invalid date format: %sn", opt_arg());
goto err;
}
break;
或此处:
int set_dateopt(unsigned long *dateopt, const char *arg)
{
if (strcasecmp(arg, "rfc_822") == 0)
*dateopt = ASN1_DTFLGS_RFC822;
else if (strcasecmp(arg, "iso_8601") == 0)
*dateopt = ASN1_DTFLGS_ISO8601;
return 0;
}
或者可能与该问题有关:-dateopt选项仅影响x509-日期选项输出
我想问一下,如何正确设置-dateopt
,以便将-enddate
设置为ISO 8601
日期格式?
我尝试过:iso_8601
、ISO_8601
、"iso 8601"
、ISO 8601
、iso8601
、ISO8601
、iso8601
,但都不起作用。
我的:
openssl version
是:OpenSSL 3.0.2 2022年3月15日
OpenSSL 3.0.2 2022年3月15日
openssl 3.0.3及更低版本中的相关函数被破坏,因为函数set_dateopt(您引用的(总是返回0:
int set_dateopt(unsigned long *dateopt, const char *arg)
{
if (OPENSSL_strcasecmp(arg, "rfc_822") == 0)
*dateopt = ASN1_DTFLGS_RFC822;
else if (OPENSSL_strcasecmp(arg, "iso_8601") == 0)
*dateopt = ASN1_DTFLGS_ISO8601;
return 0;
}
这似乎在openssl 3.0.4中得到了修复。请参阅第18553期的错误报告和第18554期的修复程序。