如何从 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 --help
或 man 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
我想知道是否可以将日期 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 --help
或 man 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