概要
昨日の「SSL証明書の有効期限確認を確認するスクリプト」は、確認するURLをスクリプト内にべた書きしているため、利便性に欠けます。
そこで、もっと使いやすく改良してもらいました。
ChatGPTに実装してもらった内容
- URLを対話型で入力する
- 存在しないURLやアクセスできないサイト(ローカルNW内など)を入力した場合はタイムアウトする
の2点。
スクリプト内容
- qa_ssl_checker.rb
require 'openssl'
require 'socket'
require 'date'
require 'uri'
require 'timeout'
# ユーザーからURLを対話的に受け取る
def get_user_input
print "チェックしたいサイトのURLを入力してください(https://example.comのような形式): "
gets.chomp
end
# 変数で指定したURLに接続して証明書の有効期限を取得するメソッド
def get_certificate_expiry_date(url)
uri = URI.parse(url)
hostname = uri.host
ssl_socket = nil
tcp_client = nil
begin
# タイムアウトを5秒に設定してSSL接続を確立
Timeout.timeout(5) do
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
end
rescue Timeout::Error
return nil, "サーバーへの接続がタイムアウトしました。"
rescue => e
return nil, e.to_s
ensure
ssl_socket&.close
tcp_client&.close
end
end
# メイン処理
def main
url = get_user_input
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
スクリプト実行結果
bash qa_ssl_checker.rb
チェックしたいサイトのURLを入力してください(https://example.comのような形式): https://news.bbc.co.uk
サイト https://news.bbc.co.uk の有効期限は 2024/03/04 です。残り 139 日です。
これによって、ブラウザのマウス操作より確実にSSL証明書の有効期限を確認することができるようになりました。