[linux] PEM으로 인코딩 된 인증서에서 SSL 인증서 만료 날짜를 결정하는 방법은 무엇입니까?

Mac 또는 Linux에 실제 파일과 Bash 셸이있는 경우 인증서 파일이 만료되는시기를 어떻게 쿼리 할 수 ​​있습니까? csr, key, pem 및 chain 파일이 있다고 가정하면 웹 사이트는 아니지만 실제로 인증서 파일 자체입니다.



답변

openssl:

openssl x509 -enddate -noout -in file.pem

출력 형식은 다음과 같습니다.

notAfter=Nov  3 22:23:50 2014 GMT

또한 위의 날짜를 구문 분석하지 않고 인증서가 만료되었는지 여부 또는 특정 기간 내에 인증서를 쉽게 확인하는 방법에 대해서는 MikeW의 답변 을 참조하십시오 .


답변

인증서가 만료되었는지 또는 다음 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 초 동안 종료되지 않으면 종료 코드 (0)를 반환합니다. 인증서가 만료되었거나 이미 완료되었거나 유효하지 않거나 존재하지 않는 파일과 같은 다른 오류가있는 경우 반환 코드는 1입니다.

(물론 시간 / 날짜가 올바르게 설정되어 있다고 가정합니다)


답변

다음은 가장 최근에 먼저 만료되는 여러 인증서를 만료 순서대로 나열하는 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


답변

다음은 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


답변

도메인 인증서가 얼마 후 (예 : 15 일) 만료 될 경우 true / false에 대한 한 줄 확인 :

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


답변

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플래그를 좋아하지 않았습니다 .


답변

허용 된 답변과 동일하지만 파일 위치 를 찾을 수없는 경우를 대비 하여 .crt파일뿐만 아니라 .pem파일 에서도 작동 .pem합니다.

openssl x509 -enddate -noout -in e71c8ea7fa97ad6c.crt

결과:

notAfter=Mar 29 06:15:00 2020 GMT