如何正确设置
-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日)
相关函数在 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 了解修复。
对于那些使用
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
仅适用于“日期”。