PEMエンコードされた証明書からSSL証明書の有効期限を決定する方法は?


327

MacまたはLinuxに実際のファイルとBashシェルがある場合、証明書ファイルの有効期限を照会するにはどうすればよいですか?Webサイトではなく、実際には証明書ファイル自体。csr、key、pem、およびchainファイルがあると想定しています。

回答:


630

openssl

openssl x509 -enddate -noout -in file.pem

出力は次の形式になります。

notAfter=Nov  3 22:23:50 2014 GMT

上記の日付を解析せずに、証明書の有効期限が切れているかどうか、または一定期間内に有効になるかどうかを簡単に確認する方法については、MikeWの回答も参照してください。


19
ユーティリティには-startdateおよび-enddateオプションが組み込まれていx509ます。彼らはあなたを救うでしょうgrep
jww 2014年

2
これは、ファイルがPEM形式でない場合にも機能します。server.crtで正常に動作します

163

証明書の有効期限が切れているかどうかを知りたいだけの場合(または次の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

これにより、日付/時刻の比較を自分で行う必要がなくなります。

openssl0上記の例では、証明書が失効していない場合は終了コード(ゼロ)を返し、次の86400秒間は失効しません。証明書の有効期限が切れているか、すでに有効期限が切れている場合、または無効なファイルや存在しないファイルなどのその他のエラーの場合、戻りコードは1です。

(もちろん、時刻/日付が正しく設定されていることを前提としています)


8
証明書が現在期限切れかどうかを判断するには、ゼロ秒の期間を使用します。-nooutオプションを省略して、余分なロジックなしで単一のコマンドを使用して役立つメッセージを表示します。たとえば、openssl x509 -checkend 0 -in file.pem「証明書が期限切れになる」または「証明書が期限切れにならない」という出力が表示され、証明書が0秒で期限切れになるかどうかが示されます。
LS

1
ありがとう!これはまさに私が必要としたものです!終了コードを使用すると、はるかに小さく/クリーンなプログラムになります。
ロンカウト

24

以下に、複数の証明書を有効期限の順にリストするための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

非常に素晴らしい!これは私が求めていたものです。これで、間もなく更新する必要がある証明書の概要がわかりました。定期的に確認できるように、ホームフォルダにcheckcerts.shとして保存しました。次に、毎月CRONジョブをチェックして、更新が必要な証明書をメールで送信することになります。
ピート

3
非常に役に立ちます。私はこのcronjobを使用しています0 7 * * 1 /path/to/cert.sh | mail -s "certbot" my@email.com
Matthieu

10

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

驚くべきことに、osx 10.13.4はシェルを正常に実行します(アプリをアプリストアにプッシュするのは今日だけosxだと判断しないでください...まもなくLinuxに再起動します;-)
Scott Stensland

1
@ScottStensland審査中:-P。私はMacを頻繁に使用していますが、Linuxの方がずっと優れています。
マイクQ

そのコード抜粋をありがとうございました!なんて面倒な作業でしょう:)、opensslにunixtimeタイムスタンプフラグがあったらいいのにと思います。
user1279741 2018

1
アルパインLinuxコンテナーを使用しているexpiry_date場合は、値の最後からタイムゾーン名を削除する必要があります。追加の追加cutこれを行うには、パイプの端に:| cut -d ' ' -f 1-4
Droogans

5

ドメインの証明書が後で期限切れになるかどうかをtrue / falseで確認する1行(例:15日):

if openssl x509 -checkend $(( 24*3600*15 )) -noout -in <(openssl s_client -showcerts -connect may.domain.com:443 </dev/null 2>/dev/null | openssl x509 -outform PEM)
then
  echo 'good'
else
  echo 'bad'
fi

2

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フラグを気に入らなかった。


.pemファイルを作成せず.cer、Apple Devサイトから証明書を作成してダウンロードしただけの場合、これをどのように行いますか?
Alex Zavatone

1

受け入れられた回答.crtと同じ.pemですが、.pemファイルの場所が見つからない場合に備えて、ファイルだけでなくファイルでも機能することに注意してください。

openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt

結果:

notAfter=Mar 29 06:15:00 2020 GMT

0

(何らかの理由で)LinuxでGUIアプリケーションを使用したい場合は、gcr-viewer(ほとんどのディストリビューションでは、パッケージによってインストールされますgcr(それ以外の場合はパッケージ内gcr-viewer))を使用します。

gcr-viewer file.pem
# or
gcr-viewer file.crt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.