LetsEncrypt를 사용하여 SSL을 자동으로 갱신하는 스크립트를 만들어 보세요.
일일 스크립트는 먼저 SSL 만료 시간을 확인합니다.
response="$(openssl x509 -enddate -noout -in ~/letsencrypt/www.mydomain.com/cert.pem)"
$response
예notAfter=May 9 19:27:44 2018 GMT
오늘 날짜와 비교하여 시차가 7일 이하인지 확인하고 싶습니다. 의사코드:
if [$response is less than 7 days away from today] then cd ~/letsencrypt $$ ~/dehydrated/dehydrated --cron --domain www.mydomain.com --out . --challenge http-01
어떻게 해야 하나요?
$response
보다 실행 가능한 형식으로 변환하려고 시도했지만 오류가 date -d
발생합니다 .date: extra operand ‘19:27:44’
답변1
귀하가 요청한 특정 질문보다는 귀하의 실제 우려 사항을 해결해 드리겠습니다. dehydrated --cron
날짜가 확인되었습니다.
문서:
--cron
(-c
) 존재하지 않는/변경/만료된 인증서에 서명/갱신합니다.
암호:
# Check expire date of existing certificate
if [[ -e "${cert}" ]]; then
echo " + Checking expire date of existing cert..."
valid="$("${OPENSSL}" x509 -enddate -noout -in "${cert}" | cut -d= -f2- )"
printf " + Valid till %s " "${valid}"
if "${OPENSSL}" x509 -checkend $((RENEW_DAYS * 86400)) -noout -in "${cert}"; then
printf "(Longer than %d days). " "${RENEW_DAYS}"
if [[ "${force_renew}" = "yes" ]]; then
echo "Ignoring because renew was forced!"
else
# Certificate-Names unchanged and cert is still valid
echo "Skipping renew!"
(https://github.com/lukas2511/de线/blob/master/de线#L1234-L1253)
RENEW_DAYS
기본값은 30인 것 같지만 구성 파일을 사용하여 이를 재정의할 수 있습니다.문서:
deHydrated는 여러 다른 위치에서 구성 파일을 찾고 있으며 다음 순서로 찾은 첫 번째 파일을 사용합니다.
/etc/dehydrated/config
/usr/local/etc/dehydrated/config
- 쉘의 현재 작업 디렉토리
- 탈수를 실행할 디렉터리
샘플 구성 파일에는 다음 줄이 포함되어 있습니다.
# Minimum days before expiration to automatically renew certificate (default: 30)
#RENEW_DAYS="30"
예를 들어 값을 기본값인 30일에서 7일로 낮추려면 두 번째 줄을 다음과 같이 편집합니다.
RENEW_DAYS="7"
답변2
이제 1970년 1월 1일까지의 초 수를 구하고 그 차이를 하루의 초 수로 나눕니다.
$ TZ=GMT date -d "May 9 19:27:44 2018 GMT" '+%s'
1525894064
$ TZ=GMT date '+%s'
1518192447
$ expr \( 1525894064 - 1518192447 \) / 86400
89
답변3
다음 명령은 "지금부터 7일" 날짜와 비교하여 openssl 명령이 제공한 날짜를 확인합니다. openssl 날짜(에포크 이후 초)가 지금부터 7일(에포크 이후 초)보다 작으면 명령이 if
성공하고 사용자는 필요한 것을 할 수 있습니다:
response="$(openssl x509 -enddate -noout -in ~/letsencrypt/www.mydomain.com/cert.pem)"
responsetime=${response##notAfter=}
responsetz={$responsetime##* }
if [ $(date -d "$responsetime" +%s) -lt $(TZ=$responsetz date -d "now + 7 days" +%s) ]
then
## do the needful
fi
첫 번째 할당($response를 얻은 후)은 선행 "notAfter=" 텍스트를 제거합니다. 두 번째 작업은 응답의 시간대를 캡처합니다. 이는 항상 GMT인 경우 단순화될 수 있습니다.
이 두 날짜 명령은 openssl 날짜와 "현재 + 7일" 이후의 (GNU) 날짜 시간(초)을 요청합니다. 두 번째 호출의 시간대를 openssl 명령에서 보고된 시간대로 설정하도록 주의하세요.