概要

2023年10月現在、自分のサイトの証明書はLet's Encryptのワイルドカード証明書を利用しています。
性質上、有効期限が90日のため「いつ頃が有効期限か」を確認するためのスクリプトをChatGPTに書いてもらいました。

スクリプトが動く要件

  • サーバがインターネットに接続されていること。
  • Rubyがインストールされていること。
  • Opensslがインストールされていること。

指示した内容

  1. 変数で指定したURLにopensslで接続
  2. 証明書の有効期限を読み取る
  3. 「サイト ○○ の有効期限はyyyy/mm/dd です。残り○日です」と表示する

返ってきたスクリプト

  • ssl_cecker.rb
  • URLは必要に応じて変更してください。
require 'openssl'
require 'socket'
require 'date'
require 'uri'  # URIモジュールを追加

# 変数で指定したURL
url = "https://hoge.example.com"

# 変数で指定したURLに接続して証明書の有効期限を取得するメソッド
def get_certificate_expiry_date(url)
  uri = URI.parse(url)
  hostname = uri.host

  begin
    # SSL接続を確立
    tcp_client = TCPSocket.new(hostname, 443)
    ssl_context = OpenSSL::SSL::SSLContext.new
    ssl_socket = OpenSSL::SSL::SSLSocket.new(tcp_client, ssl_context)
    ssl_socket.hostname = hostname
    ssl_socket.connect

    # 証明書の有効期限を取得
    cert = ssl_socket.peer_cert
    expiration_date = DateTime.parse(cert.not_after.to_s)
    days_remaining = (expiration_date - DateTime.now).to_i

    return expiration_date, days_remaining
  rescue => e
    return nil, e.to_s
  ensure
    ssl_socket&.close
    tcp_client&.close
  end
end

# メイン処理
def main(url)
  expiration_date, days_remaining = get_certificate_expiry_date(url)

  if expiration_date
    formatted_date = expiration_date.strftime("%Y/%m/%d")
    puts "サイト #{url} の有効期限は #{formatted_date} です。残り #{days_remaining} 日です。"
  else
    puts "証明書の取得に失敗しました: #{days_remaining}"
  end
end

# メイン処理を呼び出し
main(url)

スクリプト実行例

ruby ssl_checker.rb

サイト https://hoge.example.com の有効期限は 2024/01/12 です。残り 88 日です。

motodへの登録

これはサーバ管理の度に確認したいので、motdに以下のスクリプトを管理者権限で配置します。

  • ファイル名
/etc/update-motd.d/99-custom-motd
  • スクリプト内容
#!/bin/bash
ruby /path/to/directory/ssl_cecker.rb
  • 実行権付与
sudo chmod +x /etc/update-motd.d/99-custom-motd

motd登録確認

任意のターミナルクライアントでSSH接続後、

サイト https://hoge.example.com の有効期限は 2024/01/12 です。残り 88 日です。

と表示されればうまくいっています。

備考

  • 今回のChatGPTへの伺いはほぼ一発でした。
  • 対話型やテキストを読み込むなども機を見て実装させたいです。