概要
2023年10月現在、自分のサイトの証明書はLet's Encryptのワイルドカード証明書を利用しています。
性質上、有効期限が90日のため「いつ頃が有効期限か」を確認するためのスクリプトをChatGPTに書いてもらいました。
スクリプトが動く要件
- サーバがインターネットに接続されていること。
- Rubyがインストールされていること。
- Opensslがインストールされていること。
指示した内容
- 変数で指定したURLにopensslで接続
- 証明書の有効期限を読み取る
- 「サイト ○○ の有効期限は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への伺いはほぼ一発でした。
- 対話型やテキストを読み込むなども機を見て実装させたいです。