openssl 使用 -dateopt 会导致“无效的日期格式:iso_8601”错误

问题描述 投票:0回答:2

如何正确设置

-dateopt
的选项
openssl

自签名证书生成的示例:

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
的结束日期:

openssl x509 -enddate -noout -in "$PWD/self.crt"

返回正确的结果:

notAfter=2022 年 10 月 4 日 16:05:59 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: %s\n", 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 -dates 选项输出

我想问如何正确设置

-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日)

ssl openssl ssl-certificate command-line-interface iso8601
2个回答
3
投票

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 中已修复。请参阅 issue #18553 了解错误报告,并参阅 issue #18554 了解修复。


0
投票

对于那些使用

openssl 3.0.3 and lower
的人,您可以将
-enddate
-startdate
的输出通过管道传输到
date
包。例如:-

openssl x509 -noout -enddate \
-in /etc/letsencrypt/live/srv.example.com/cert.pem \
| awk -F '=' '{print $2}' \
| date --iso-8601=seconds -f -

/etc/letsencrypt/live/srv.example.com/cert.pem
替换为您的证书文件路径。

对于其他日期格式,请检查:https://unix.stackexchange.com/questions/164826/date-command-iso-8601-option 即:

date --iso-8601=date
仅适用于“日期”。

© www.soinside.com 2019 - 2024. All rights reserved.