Programing

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

lottogame 2020. 3. 28. 10:11
반응형

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

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


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

(어떤 이유로 든) Linux에서 GUI 응용 프로그램을 사용하려는 경우 gcr-viewer(대부분의 배포에서 패키지에 의해 설치됩니다 gcr(그렇지 않으면 패키지에 있음 gcr-viewer))

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

참고 : https://stackoverflow.com/questions/21297853/how-to-determine-ssl-cert-expiration-date-from-a-pem-encoded-certificate

반응형