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


326

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

답변:


629

openssl:

openssl x509 -enddate -noout -in file.pem

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

notAfter=Nov  3 22:23:50 2014 GMT

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


19
또한이 -startdate-enddate에 내장 된 옵션 x509유틸리티를. 그들은 당신을 저장합니다 grep.
jww

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

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


8
인증서가 현재 만료되었는지 확인하려면 지속 시간을 0 초로 사용하십시오. -noout추가 논리없이 단일 명령을 사용하여 유용한 메시지를 보려면 옵션을 생략 하십시오. 예를 들어, openssl x509 -checkend 0 -in file.pem인증서가 0 초 내에 만료되는지 여부를 나타내는 "인증서 만료"또는 "인증서 만료되지 않음"출력을 제공합니다.
LS

1
감사! 이것이 바로 내가 필요한 것입니다! 종료 코드를 사용하면 훨씬 더 작거나 더 깨끗한 프로그램을 만들 수 있습니다.
Lon Kaut

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 작업을 통해 매월 확인하고 갱신이 필요한 인증서를 이메일로 보내십시오.
Pete

3
매우 유용한 감사합니다. 이 크론 작업을 사용합니다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에서만 앱을 앱 스토어로 푸시하려고합니다. 곧 리눅스로 부팅합니다. ;-)
Scott Stensland

1
@ScottStensland 우리는 :-P를 판단하고 있습니다. 저는 Mac을 많이 사용하지만 Linux가 훨씬 좋습니다.
Mike Q

그 코드 스 니핏에 대단히 감사합니다! 성가신 작업 :), openssl에 대한 unixtime 타임 스탬프 플래그가 있었으면 좋겠다.
user1279741

1
알파인 리눅스 컨테이너에있는 사람들의 경우, expiry_date값에서 시간대 이름을 제거해야합니다. 이를 cut위해 파이프 끝에 추가 를 추가하십시오 .| cut -d ' ' -f 1-4
Droogans

5

도메인 인증서가 얼마 후 (예 : 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

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 파일을 만들지 않았지만 .cerApple 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.