web-dev-qa-db-ja.com

SSL証明書が有効かどうかを確認するスクリプト

SSL証明書をいくつか持っていますが、証明書の有効期限が切れたときに通知を受け取りたいです。

私のアイデアは、毎日簡単なコマンドを実行するcronjobを作成することです。

Linuxのopensslコマンドを使用して、リモートサーバーの証明書情報を表示できることを知っています。

openssl s_client -connect www.google.com:443

ただし、この出力には有効期限が表示されません。また、私はこのコマンドを CTRL+c

スクリプトからリモート証明書の有効期限を確認し(できればopensslを使用)、「バッチモード」で実行して、ユーザーの操作なしで自動的に実行されるようにするにはどうすればよいですか?

15
Martin Vegter

コマンドは、たとえばGET index.phpなどのhttpリクエストを期待します。代わりにこれを使用してください:

if true | openssl s_client -connect www.google.com:443 2>/dev/null | \
  openssl x509 -noout -checkend 0; then
  echo "Certificate is not expired"
else
  echo "Certificate is expired"
fi

  • true:入力なしでeofが続くため、opensslは接続後に終了します。
    • openssl ...:質問からのコマンド
    • 2>/dev/null:エラー出力は無視されます。
  • openssl x509:X.509証明書データ管理をアクティブ化します。
    • これはデフォルトで標準入力から読み取ります
    • -noout:証明書の出力全体を抑制します
    • -checkend 0:証明書が次の0秒で期限切れになるかどうかを確認します
20
chaos

証明書は取得されますが、デコードはされません。日付が必要な場合に必要になるため、表示されません。したがって、必要なのは、それをOpenSSLのx509アプリケーションにパイプして、証明書をデコードすることです。

openssl s_client -connect www.example.com:443 \
    -servername www.example.com </dev/null |\
    openssl x509 -in /dev/stdin -noout -text

これにより、有効期限を含む完全なデコード済み証明書がstdoutに提供されます。

7
Wouter Verhelst

この ブログ投稿 のおかげで有効期限を確認する必要がある場合は、1回の呼び出しでこの情報を他の関連情報とともに見つける方法を見つけました。

echo | openssl s_client -servername unix.stackexchange.com -connect unix.stackexchange.com:443 2>/dev/null | openssl x509 -noout -issuer -subject -dates

出力には、発行者、件名(証明書の発行先)、発行日、最後に有効期限が含まれます。

issuer= /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High Assurance Server CA
subject= /C=US/ST=NY/L=New York/O=Stack Exchange, Inc./CN=*.stackexchange.com
notBefore=May 21 00:00:00 2016 GMT
notAfter=Aug 14 12:00:00 2019 GMT
3
Robert Lujo