web-dev-qa-db-ja.com

PEMエンコード証明書からSSL証明書の有効期限を判断する方法

実際のファイルとBash ShellをMacまたはLinuxに持っている場合、どのようにして有効期限が切れるのか証明書ファイルに問い合わせることができますか? csr、key、pem、chainの各ファイルがあるとすれば、Webサイトではなく、実際には証明書ファイルそのものです。

247
GL2014

opensslの場合:

openssl x509 -enddate -noout -in file.pem

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

notAfter=Nov  3 22:23:50 2014 GMT

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

498
that other guy

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

(もちろん、それは時間/日付が正しく設定されていると仮定します)

130
MikeW

これは私の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
14

これは、DNSラウンドロビンを使用していると仮定して、すべてのサーバーをチェックするbash関数です。これにはGNU dateが必要であり、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
6
Andrew

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フラグが好きではありませんでした。

2
Donald.M

証明書がしばらくして期限切れになった場合、1行でtrue/falseをチェックします(例: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
0
Alexey

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

gcr-viewer file.pem
# or
gcr-viewer file.crt
0
Attila123