使用 -dateopt 的 openssl 会导致"Invalid date format: iso_8601"错误



如何正确设置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.crti运行的结束日期:

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_8601ISO_8601"iso 8601"ISO 8601iso8601ISO8601iso8601,但都不起作用。

我的:

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期的修复程序。

最新更新