opensslコマンドでSSL/TLS証明書を確認する方法|有効期限・暗号スイート・接続テストも

運営:リナックスマスター.JP(代表 宮崎智広)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxtips > opensslコマンドでSSL/TLS証明書を確認する方法|有効期限・暗号スイート・接続テストも
「opensslコマンドって何ができるの?」
「SSL証明書の有効期限を確認したいけど、どこを見ればいいかわからない...」
Webサーバーを運用していると、証明書の期限切れや暗号スイートの設定ミスが原因でサービスが停止するトラブルは珍しくありません。

この記事では、openssl コマンド の実践的な使い方を解説します。
証明書の有効期限確認・リモートサーバーへの接続テスト・SAN付き自己署名証明書の作成・内部CA構築まで、現場で頻出する操作をカバーします。動作確認環境は RHEL 9.4 / Ubuntu 24.04 LTS です。

この記事のポイント

・openssl s_client でリモートサーバーのSSL/TLS接続状態を確認できる
・openssl x509 -dates で証明書の有効期限を即座に表示できる
・暗号スイートやプロトコルバージョンの確認も openssl s_client 一本で対応
・自己署名証明書はSAN(Subject Alternative Names)を入れないとブラウザが警告を出す
・内部CAを立てると複数サーバーの証明書をまとめて管理できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

opensslとは?現場エンジニアが知っておくべき基礎

openssl は、SSL/TLS プロトコルの実装ライブラリ「OpenSSL」に付属するコマンドラインツールです。証明書の内容確認・暗号化・復号・署名の検証など、セキュリティ関連の操作を幅広くこなせます。

主な用途を整理しておきましょう。

・s_client:リモートサーバーへTLS接続してハンドシェイクの詳細を確認する
・x509:証明書ファイルの内容(有効期限・発行者・SAN等)を表示する
・req:CSR(証明書署名要求)や自己署名証明書を生成する
・enc:ファイルを対称鍵暗号で暗号化・復号する
・genrsa / genpkey:秘密鍵を生成する

Red Hat系(RHEL/Rocky Linux)でも Debian 系(Ubuntu)でも標準でインストール済みのため、追加インストールは不要です。

opensslのバージョン確認とインストール

まず手元の環境で使えるバージョンを確認します。

$ openssl version OpenSSL 3.2.2 4 Jun 2024 (Library: OpenSSL 3.2.2 4 Jun 2024)

コマンドが見つからない場合はパッケージをインストールします。

# RHEL / Rocky Linux / AlmaLinux # dnf install openssl -y # Ubuntu / Debian # apt install openssl -y

openssl 1.1.x から 3.x に変わった環境では、一部の古いオプション(-des3 等)の動作が変わっています。特にSAN(Subject Alternative Names)周りの設定ファイルの書き方も 1.x 系と 3.x 系で異なるため、バージョンを把握してから作業を始める習慣をつけましょう。RHEL 8 / Ubuntu 22.04 以降は OpenSSL 3.x が標準です。

SSL/TLS証明書の有効期限を確認する方法

サーバー管理で最も頻繁に使う操作が証明書の有効期限確認です。期限切れを事前に検知するために、定期的に実行するスクリプトに組み込む現場も多いです。

1. リモートサーバーの証明書を確認する

openssl s_client でサーバーに接続し、openssl x509 -dates で有効期限だけを抽出します。

$ echo | openssl s_client -connect www.linuxmaster.jp:443 -servername www.linuxmaster.jp 2>/dev/null \ | openssl x509 -noout -dates notBefore=Mar 11 00:00:00 2025 GMT notAfter=Apr 10 23:59:59 2026 GMT

・-connect ホスト名:ポート番号:接続先を指定する(HTTPS は 443)
・-servername ホスト名:SNI(Server Name Indication)を指定する(同一IPで複数ドメインを運用している環境では必須)
・echo |:対話的な入力を閉じてコマンドを終了させるためのパイプ
・-noout -dates:証明書の有効期間(notBefore / notAfter)だけを表示する

2. ローカルの証明書ファイルを確認する

サーバーにデプロイ済みの証明書ファイルを直接読む場合は次のようにします。

$ openssl x509 -in /etc/pki/tls/certs/server.crt -noout -dates notBefore=Mar 11 00:00:00 2025 GMT notAfter=Apr 10 23:59:59 2026 GMT # 証明書の詳細情報(サブジェクト・発行者・SAN)も確認したい場合 $ openssl x509 -in /etc/pki/tls/certs/server.crt -noout -subject -issuer -ext subjectAltName subject=CN = www.linuxmaster.jp issuer=C = US, O = DigiCert Inc, CN = RapidSSL TLS RSA CA G1 X509v3 Subject Alternative Name: DNS:www.linuxmaster.jp, DNS:linuxmaster.jp

有効期限が近い場合に警告を出すシェルスクリプトへの組み込み例は後の「実務Tips」セクションで紹介します。

TLS接続の詳細情報を確認する(暗号スイート・プロトコルバージョン)

本番サーバーで「TLS 1.2以上のみ許可しているか」「脆弱な暗号スイートが使われていないか」を確認したい場面があります。openssl s_client の出力には接続時のネゴシエーション結果が含まれます。

1. 接続時のプロトコルと暗号スイートを確認する


$ echo | openssl s_client -connect www.linuxmaster.jp:443 2>/dev/null | grep -E "Protocol|Cipher" Protocol : TLSv1.3 Cipher : TLS_AES_256_GCM_SHA384

「TLSv1.3」「TLS_AES_256_GCM_SHA384」が表示されれば、最新プロトコルで安全な暗号が使われているということです。

2. 特定プロトコルバージョンのみ強制接続する

「TLS 1.2 での接続が通るか確認したい」という場合はオプションで強制できます。

# TLS 1.2 のみ許可して接続テスト $ echo | openssl s_client -connect www.example.com:443 -tls1_2 2>&1 | grep -E "Protocol|alert" # TLS 1.1 が拒否されることを確認(セキュリティ強化チェック) $ echo | openssl s_client -connect www.example.com:443 -tls1_1 2>&1 | tail -5

TLS 1.1 が無効化されていれば alert handshake failure や接続拒否のメッセージが返ります。これを確認することで、古いプロトコルの無効化設定が正しく機能しているかを検証できます。

実務Tips:証明書管理の現場ノウハウ

1. 有効期限が30日以内なら警告するスクリプト

証明書の期限切れによるサービス停止を防ぐためにcronで定期実行するスクリプトです。

#!/bin/bash # check-cert-expiry.sh - SSL証明書の有効期限を確認して30日前に警告する HOST="www.linuxmaster.jp" WARN_DAYS=30 NOTIFY_EMAIL="admin@example.com" # 有効期限を取得(秒単位のUnixタイム) EXPIRY=$(echo | openssl s_client -connect "${HOST}:443" -servername "${HOST}" 2>/dev/null \ | openssl x509 -noout -enddate \ | sed 's/notAfter=//') EXPIRY_EPOCH=$(date -d "${EXPIRY}" +%s) NOW_EPOCH=$(date +%s) DAYS_LEFT=$(( (EXPIRY_EPOCH - NOW_EPOCH) / 86400 )) if [ "${DAYS_LEFT}" -le "${WARN_DAYS}" ]; then echo "警告: ${HOST} の証明書は残り ${DAYS_LEFT} 日で失効します" \ | mail -s "[SSL期限警告] ${HOST}" "${NOTIFY_EMAIL}" fi

このスクリプトをcronに登録すれば、更新作業を忘れていても30日前にメール通知が届きます。

2. 自己署名証明書を1コマンドで作成する

開発環境・検証環境用に自己署名証明書(オレオレ証明書)を手早く作りたい場面があります。

# 秘密鍵と自己署名証明書を同時に生成(有効期間365日) $ openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt \ -days 365 -nodes -subj "/CN=localhost" # 生成ファイルを確認 $ ls -lh server.key server.crt -rw------- 1 user user 1.7K Apr 13 10:00 server.key -rw-r--r-- 1 user user 1.1K Apr 13 10:00 server.crt

・-nodes:秘密鍵をパスフレーズなしで保存する(サービス自動起動時に必要)
・-subj:証明書のサブジェクトをコマンドラインで指定する(対話入力をスキップ)
・rsa:2048:2048ビットのRSA鍵を生成する(本番環境では4096ビットを推奨)

ただし、Chrome 58以降のブラウザはCNフィールドを無視してSANフィールドのみで証明書を検証します。上記のコマンドはSANなしのため、ブラウザで開くと「NET::ERR_CERT_COMMON_NAME_INVALID」エラーが出ます。ブラウザから接続する検証環境では、次のSAN付き手順を使ってください。

3. SAN(Subject Alternative Names)付き証明書を作成する

SAN付きの証明書を発行するには、設定ファイルを用意してから生成します。IPアドレスでアクセスする検証サーバーでも、複数のFQDNを持つサーバーでも、この方法が現場では標準です。

# SANを含む設定ファイルを作成する $ cat > san.conf << 'EOF' [req] default_bits = 2048 prompt = no distinguished_name = dn x509_extensions = v3_req [dn] C = JP ST = Tokyo O = Example Corp CN = 192.168.10.100 [v3_req] subjectAltName = @alt_names [alt_names] IP.1 = 192.168.10.100 DNS.1 = myserver.local DNS.2 = www.myserver.local EOF # SANを含む自己署名証明書を生成する $ openssl req -x509 \ -newkey rsa:2048 \ -keyout server.key \ -out server.crt \ -days 365 \ -nodes \ -config san.conf # SANが設定されているか確認する $ openssl x509 -text -noout -in server.crt | grep -A2 "Subject Alternative Name" X509v3 Subject Alternative Name: IP Address:192.168.10.100, DNS:myserver.local, DNS:www.myserver.local

複数のIPアドレスやFQDNに対応するには、alt_namesセクションに IP.2、DNS.3 と番号を増やして追加します。

4. 内部CA(認証局)を構築して証明書を発行する

開発チーム内で複数のサーバーに証明書を発行したい場合、内部CAを立てると効率が上がります。CAの証明書を各PCに一度インポートするだけで、そのCAが発行した証明書はすべて「信頼済み」として扱われます。

まずCA用のルート証明書を作成します。

# CA用のディレクトリを作成する $ mkdir -p /etc/ssl/myca/certs /etc/ssl/myca/private $ chmod 700 /etc/ssl/myca/private # CA用の秘密鍵を生成する(4096bit 推奨) $ openssl genrsa -out /etc/ssl/myca/private/ca.key 4096 $ chmod 600 /etc/ssl/myca/private/ca.key # CA自己署名証明書を生成する(有効期間10年) $ openssl req -x509 \ -new \ -key /etc/ssl/myca/private/ca.key \ -out /etc/ssl/myca/certs/ca.crt \ -days 3650 \ -subj "/C=JP/ST=Tokyo/O=Example Internal CA/CN=Example Root CA" # CA証明書の確認 $ openssl x509 -noout -issuer -subject -dates -in /etc/ssl/myca/certs/ca.crt issuer=C=JP, ST=Tokyo, O=Example Internal CA, CN=Example Root CA subject=C=JP, ST=Tokyo, O=Example Internal CA, CN=Example Root CA notBefore=Sep 27 01:15:00 2026 GMT notAfter=Sep 25 01:15:00 2036 GMT

次にサーバー用の証明書を発行します。CSR(Certificate Signing Request)を作り、CAで署名する流れです。

# サーバー用秘密鍵を生成する $ openssl genrsa -out server.key 2048 # SAN設定ファイルを作成する $ cat > server-ext.conf << 'EOF' basicConstraints=CA:FALSE keyUsage = digitalSignature, keyEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1 = webserver01.local IP.1 = 192.168.10.100 EOF # CSRを生成する $ openssl req -new \ -key server.key \ -out server.csr \ -subj "/C=JP/ST=Tokyo/O=Example Corp/CN=webserver01.local" # CAの秘密鍵でCSRに署名してサーバー証明書を発行する $ openssl x509 -req \ -in server.csr \ -CA /etc/ssl/myca/certs/ca.crt \ -CAkey /etc/ssl/myca/private/ca.key \ -CAcreateserial \ -out server.crt \ -days 365 \ -extfile server-ext.conf # 発行者(Issuer)がCAと一致しているか確認する $ openssl x509 -noout -issuer -subject -dates -in server.crt issuer=C=JP, ST=Tokyo, O=Example Internal CA, CN=Example Root CA subject=C=JP, ST=Tokyo, O=Example Corp, CN=webserver01.local notBefore=Sep 27 01:20:00 2026 GMT notAfter=Sep 27 01:20:00 2027 GMT

CA証明書(ca.crt)の秘密鍵(ca.key)は外部に漏れると全サーバー証明書が危険にさらされます。/etc/ssl/myca/private/ のパーミッションを 700 に絞り、アクセスをCAサーバーの管理者に限定してください。

5. Nginxに証明書を設定してHTTPSを有効にする

発行した証明書をNginxに組み込む最小構成の例です。

# /etc/nginx/conf.d/ssl.conf(最小構成の例) server { listen 443 ssl; server_name webserver01.local; ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; # TLS 1.2以上のみ許可する ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { root /usr/share/nginx/html; index index.html; } } # HTTP → HTTPS リダイレクト(任意) server { listen 80; server_name webserver01.local; return 301 https://$host$request_uri; }

# 証明書と秘密鍵を配置する $ mkdir -p /etc/nginx/ssl $ cp server.crt server.key /etc/nginx/ssl/ $ chmod 600 /etc/nginx/ssl/server.key # Nginx設定の文法チェック $ nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful # Nginxを再読み込みする $ systemctl reload nginx

6. CSR(証明書署名要求)を作成する

商用認証局への申請時に必要なCSRを生成する手順です。

# 1. 秘密鍵を生成 $ openssl genrsa -out server.key 2048 # 2. CSRを生成(認証局に提出するファイル) $ openssl req -new -key server.key -out server.csr \ -subj "/C=JP/ST=Tokyo/O=Example Inc./CN=www.example.com" # 3. CSRの内容確認(提出前に必ず確認する) $ openssl req -in server.csr -noout -text | head -10 Certificate Request: Data: Version: 1 (0x0) Subject: C=JP, ST=Tokyo, O=Example Inc., CN=www.example.com

CSRを認証局に提出すると、署名済み証明書が返ってきます。秘密鍵(server.key)は外部に漏らさず安全に保管してください。

トラブルシュート:よくあるエラーと対処法

「verify error:num=18:self-signed certificate」が表示される

自己署名証明書に接続したときに出るメッセージです。認証局に署名された証明書ではないため「検証できない」という意味で、接続自体は成功しています。証明書の内容確認が目的であれば、2>/dev/null でエラー出力を抑制してから openssl x509 にパイプすると有効期限等を取得できます。

$ echo | openssl s_client -connect localhost:8443 2>/dev/null | openssl x509 -noout -subject -dates subject=CN = localhost notBefore=Apr 13 00:00:00 2025 GMT notAfter=Apr 13 00:00:00 2026 GMT

「NET::ERR_CERT_COMMON_NAME_INVALID」がブラウザに表示される

ブラウザがSANフィールドを確認できなかったときに発生します。Chrome 58以降はCNフィールドを無視するため、CNだけ設定した証明書では必ずこのエラーになります。

・openssl x509 -text -noout -in server.crt を実行してSANセクションが存在するか確認する
・SANがない場合は上記「3. SAN付き証明書を作成する」の手順で再発行する(CNフィールドの修正では解決しない)
・ブラウザがアクセスするIPアドレスまたはFQDNがSANに登録されているかも確認する

「CONNECTED(00000003)」のあとに何も出ない

ファイアウォールでポートがブロックされているか、STARTTLS を使うプロトコル(SMTPなど)で素の TLS を試みたときに発生します。

# SMTPのSTARTTLSを使う場合は -starttls オプションを指定する $ openssl s_client -connect mail.example.com:587 -starttls smtp # ポートが開いているか先に確認する $ nc -zv mail.example.com 587

ポート確認には nc(netcat)コマンド が便利です。

「no peer certificate available」が出て証明書が取得できない

証明書が設定されていないポートや、クライアント証明書が必要なサーバーに接続したときに表示されます。対象のポートがファイアウォールで許可されているかを先に確認しましょう。ファイアウォールの設定確認は firewall-cmd コマンド で行えます。

「certificate verify failed」が内部CA証明書で出る

内部CAで発行した証明書で接続テストするとき、CA証明書(ca.crt)を -CAfile で指定していないと発生します。

# CA証明書を指定して接続テストする(Verify return code: 0 (ok) が出れば成功) $ openssl s_client -connect 192.168.10.100:443 \ -CAfile /etc/ssl/myca/certs/ca.crt \ -servername webserver01.local 2>/dev/null | grep "Verify return code" Verify return code: 0 (ok)

クライアントのOSにCA証明書を恒久インポートしたい場合は、RHEL系なら update-ca-trust、Ubuntu系なら update-ca-certificates を使います。

「unable to load Private Key」が出る場合

秘密鍵ファイルに問題があります。次のコマンドで秘密鍵が正常かどうか確認します。

# 秘密鍵の検証(RSA key ok と表示されれば正常) $ openssl rsa -check -in server.key RSA key ok

パスフレーズ付きで生成した秘密鍵を -nodes なしで使おうとしているケースがほとんどです。パスフレーズを取り除くには openssl rsa -in server.key -out server_nopass.key で変換できます。

本記事のまとめ

やりたいこと コマンド
リモートサーバーの証明書有効期限を確認 echo | openssl s_client -connect ホスト:443 -servername ホスト 2>/dev/null | openssl x509 -noout -dates
ローカル証明書ファイルの有効期限を確認 openssl x509 -in cert.crt -noout -dates
接続時のTLSプロトコルと暗号スイートを確認 echo | openssl s_client -connect ホスト:443 2>/dev/null | grep -E "Protocol|Cipher"
自己署名証明書を生成(SANなし・簡易) openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes -subj "/CN=localhost"
SAN付き自己署名証明書を生成 openssl req -x509 -newkey rsa:2048 -keyout server.key -out server.crt -days 365 -nodes -config san.conf
CSR(証明書署名要求)を生成 openssl req -new -key server.key -out server.csr -subj "/CN=ホスト名"
CAでCSRに署名してサーバー証明書を発行 openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -extfile server-ext.conf
特定TLSバージョンで接続テスト echo | openssl s_client -connect ホスト:443 -tls1_2
証明書の全情報を表示 openssl x509 -text -noout -in server.crt

openssl コマンドは一見とっつきにくいですが、使う操作は「接続テスト(s_client)」「証明書確認(x509)」「鍵・証明書生成(req / genrsa)」の3系統に集中しています。特に証明書の有効期限確認と、SAN付き自己署名証明書の発行は運用・開発の現場で必須のスキルです。

SSL/TLSで保護されたサーバーへの接続確認と合わせて、sshコマンド による安全なリモートアクセスの設定もあわせて確認しておくとよいでしょう。

opensslで証明書管理の基本はわかった。次はサーバー構築全体の流れを押さえませんか?

SSL/TLS証明書の管理はサーバー運用のほんの一部です。安全なサーバー構築全体を体系的に学ぶことが、障害を防ぐ本当の力になります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

※ 「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

<PR>手元に置いて学びを深める1冊

SSL/TLS実践入門──Webの安全性を支える暗号化技術の設計思想

証明書の仕組みからTLS 1.3のハンドシェイク詳細まで体系的に解説。openssl コマンドを使う際の「なぜ?」が一冊でわかります。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

運営

リナックスマスター.JP(代表 宮崎智広)

株式会社イーネットマーキュリーが運営するLinux教育サイトです。代表の宮崎智広は現役のLinuxサーバー管理者として20年以上の実務経験を持ち、累計3,100名以上のエンジニアを指導してきました。実践型のLinuxセミナーや無料マニュアルの配布を通じてLinux人材の育成に取り組んでいます。