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

How to convert a long date to short date from SSL certificates | Unix KSH

我想知道是否可以将日期 Oct 31 00:00:00 2013 GMT 转换为 10-31-2013

我得到的日期如下:

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

我得到的日期是 Oct 31 00:00:00 2013 GMT,我想将其转换为 10-31-2013

有什么命令可以做到这一点?还是我必须全部手动完成?

如果是这样,最好的方法是创建我自己的函数并将长日期作为参数发送,return 发送短日期。

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",)+2)/3, , }'

输出为:

10-31-2013

这个脚本在检查 url 证书时对我有用。

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

PORT 默认为 443。

不要重复之前答案中对 date 命令的解释,这里有一个紧凑的 Bash 函数,它读取证书文件并以 ISO 格式或 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= out= 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