如何从SSL证书将长日期转换为短日期|Unix KSH

5sxhfpxr  于 2022-11-04  发布在  Unix
关注(0)|答案(4)|浏览(166)

我想知道是否可以将日期转换为show Oct 31 00:00:00 2013 GMT
我得到的日期如下:

NotBeforeDate=$(openssl x509 -noout -in ${CERTIFICATE} -dates | grep "notBefore")

我得到的日期是Oct 31 00:00:00 2013 GMT,我想把它转换成10-31-2013
有什么命令可以做到这一点吗?还是我必须手动完成这一切?
如果是这样,最好的方法是创建自己的函数,将长日期作为参数发送,并返回短日期。

xcitsw88

xcitsw881#

openssl命令将使NotBeforeDate变量的值为(至少在我使用的bash版本中是这样):

notBefore=Oct 31 00:00:00 2013 GMT

因此,首先我们需要删除notBefore=部分:

dateStr=${NotBeforeDate/notBefore=/}

然后,您可以使用date命令:

date --date="$dateStr" --utc +"%m-%d-%Y"

--date选项指示命令使用dateStr值,--utc指示日期为UTC(由GMT部分指定),+"%m-%d-%Y"将日期格式化为所需的格式。
输出为:
10-31-2013

**PS:**选项可能因Linux版本而异。

您可以使用date --helpman date检查所有可用的。
例如,长选项--date--utc可能不可用,但等效的短版本可能可用(只是一个示例,我不确定date命令在不同的Unix版本之间是否有这样的变化):

date -d "$dateStr" -u +"%m-%d-%Y"

不幸的是,我没有您使用的完全相同的环境(unix中的ksh),但这应该可以工作。
-d选项似乎是GNU特有的,所以如果它不可用,你必须手动解析字符串。假设dateStr的值是Oct 31 00:00:00 2013 GMT,你可以运行:

printf '%s\n' "$dateStr" | awk '{ printf "%02d-%02d-%04d\n", (index("JanFebMarAprMayJunJulAugSepOctNovDec",$1)+2)/3, $2, $4}'

输出为:
10-31-2013

rbpvctlc

rbpvctlc2#

此脚本在检查带有证书的URL时适用。

date --date="$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:$PORT | openssl x509 -noout -enddate | awk -F '=' '{print $NF}' )" --iso-8601

PORT预设为443。

xyhw6mcr

xyhw6mcr3#

为了避免重复前面对date命令的解释,这里有一个简洁的Bash函数,它读取证书文件,并以ISO格式或Unix时间戳(用于整数比较)输出开始或结束日期,并且可以在Linux或macOS上使用:


# cert_date <date_type> <out_format> <cert_file> [openssl_opts...]

# date_type: start|end

# out_format: iso|unix

cert_date() {
  local type=$1 out=$2 args date opts fmt
  [ "$type" == start ] && args=(-startdate) || args=(-enddate)
  date=$(openssl x509 "${args[@]}" -noout -in "${@:3}")
  [[ "$OSTYPE" == darwin* ]] && opts=(-juf "%b %d %T %Y %Z") || opts=(-ud)
  [ "$out" == unix ] && fmt="%s" || fmt="%Y-%m-%dT%TZ"
  date "${opts[@]}" "${date/*=/}" +"$fmt"
}

当然,您可以通过更改fmt来增强,以适应您的输出格式需要,甚至可以添加case语句以接受更多格式。
示例:

cert_date start iso  ${CERTIFICATE}
cert_date end   unix ${CERTIFICATE} -inform der
ioekq8ef

ioekq8ef4#

我从上面的想法做了一个bash OneLiner。也许它对某人有用:
(Use'cut -c 10-'当不发出问候时(之后)

date -d "`openssl x509 -dates -noout -in /path/to/cert.pem | grep notBefore | cut -c 11-`" +%Y.%m.%d

相关问题