回答:
証明書の有効期限が切れているかどうかを知りたいだけの場合(または次のN秒以内に期限切れ-checkend <seconds>
にopenssl x509
なる場合)、次のオプションで通知します。
if openssl x509 -checkend 86400 -noout -in file.pem
then
echo "Certificate is good for another day!"
else
echo "Certificate has expired or will do so within 24 hours!"
echo "(or is invalid/not found)"
fi
これにより、日付/時刻の比較を自分で行う必要がなくなります。
openssl
0
上記の例では、証明書が失効していない場合は終了コード(ゼロ)を返し、次の86400秒間は失効しません。証明書の有効期限が切れているか、すでに有効期限が切れている場合、または無効なファイルや存在しないファイルなどのその他のエラーの場合、戻りコードは1
です。
(もちろん、時刻/日付が正しく設定されていることを前提としています)
-noout
オプションを省略して、余分なロジックなしで単一のコマンドを使用して役立つメッセージを表示します。たとえば、openssl x509 -checkend 0 -in file.pem
「証明書が期限切れになる」または「証明書が期限切れにならない」という出力が表示され、証明書が0秒で期限切れになるかどうかが示されます。
以下に、複数の証明書を有効期限の順にリストするためのbashコマンドラインを示します。
for pem in /etc/ssl/certs/*.pem; do
printf '%s: %s\n' \
"$(date --date="$(openssl x509 -enddate -noout -in "$pem"|cut -d= -f 2)" --iso-8601)" \
"$pem"
done | sort
出力例:
2015-12-16: /etc/ssl/certs/Staat_der_Nederlanden_Root_CA.pem
2016-03-22: /etc/ssl/certs/CA_Disig.pem
2016-08-14: /etc/ssl/certs/EBG_Elektronik_Sertifika_Hizmet_S.pem
0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
DNSラウンドロビンを使用している場合、すべてのサーバーをチェックするbash関数を次に示します。これにはGNUの日付が必要で、Mac OSでは機能しないことに注意してください。
function check_certs () {
if [ -z "$1" ]
then
echo "domain name missing"
exit 1
fi
name="$1"
shift
now_epoch=$( date +%s )
dig +noall +answer $name | while read _ _ _ _ ip;
do
echo -n "$ip:"
expiry_date=$( echo | openssl s_client -showcerts -servername $name -connect $ip:443 2>/dev/null | openssl x509 -inform pem -noout -enddate | cut -d "=" -f 2 )
echo -n " $expiry_date";
expiry_epoch=$( date -d "$expiry_date" +%s )
expiry_days="$(( ($expiry_epoch - $now_epoch) / (3600 * 24) ))"
echo " $expiry_days days"
done
}
出力例:
$ check_certs stackoverflow.com
151.101.1.69: Aug 14 12:00:00 2019 GMT 603 days
151.101.65.69: Aug 14 12:00:00 2019 GMT 603 days
151.101.129.69: Aug 14 12:00:00 2019 GMT 603 days
151.101.193.69: Aug 14 12:00:00 2019 GMT 603 days
expiry_date
場合は、値の最後からタイムゾーン名を削除する必要があります。追加の追加cut
これを行うには、パイプの端に:| cut -d ' ' -f 1-4
MAC OSX(El Capitan)の場合このNicholasの例の変更は私にとってうまくいきました。
for pem in /path/to/certs/*.pem; do
printf '%s: %s\n' \
"$(date -jf "%b %e %H:%M:%S %Y %Z" "$(openssl x509 -enddate -noout -in "$pem"|cut -d= -f 2)" +"%Y-%m-%d")" \
"$pem";
done | sort
出力例:
2014-12-19: /path/to/certs/MDM_Certificate.pem
2015-11-13: /path/to/certs/MDM_AirWatch_Certificate.pem
macOSは私のシステムの--date=
または--iso-8601
フラグを気に入らなかった。
.cer
、Apple Devサイトから証明書を作成してダウンロードしただけの場合、これをどのように行いますか?
-startdate
および-enddate
オプションが組み込まれていx509
ます。彼らはあなたを救うでしょうgrep
。