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日に下げるには、2行目を次のように編集します。
RENEW_DAYS="7"
答え2
今、1970年1月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 =」テキストを削除します。 2番目のタスクは応答のタイムゾーンをキャプチャします。これは常にGMTの場合は単純化できます。
これら2つの日付コマンドは、openssl日付と「現在+ 7日」以降の(GNU)日付時刻(秒)を要求します。 2番目の呼び出しのタイムゾーンをopensslコマンドで報告されたタイムゾーンに設定するように注意してください。