2026年10月10日

2026年10月10日

opensslコマンドでSSL証明書の情報を確認する方法|有効期限・SAN・発行者・中間証明書

openssl コマンドを使うと、証明書ファイルや Web サーバーが返している証明書の内容(有効期限、対象のドメイン名、発行者など)を確認できます。証明書を更新したあとの確認や、ブラウザーで証明書のエラーが出たときの原因調査に使います。

この記事のコマンドと出力は、Debian 13 の OpenSSL 3.5.7 で、当サイト(lightscend.co.jp)の Let's Encrypt の証明書を対象に確認したものです(2026年11月時点)。古い OpenSSL では使えないオプションがあるので、openssl version でバージョンを確認してください。

よく使うコマンドの一覧

確認したいこと コマンド
すべての内容 openssl x509 -in cert.pem -noout -text
対象・発行者・有効期間 openssl x509 -in cert.pem -noout -subject -issuer -dates
有効期限だけ openssl x509 -in cert.pem -noout -enddate
ドメイン名(SAN) openssl x509 -in cert.pem -noout -ext subjectAltName
30 日以内に切れるか openssl x509 -in cert.pem -noout -checkend 2592000
フィンガープリント openssl x509 -in cert.pem -noout -fingerprint -sha256
サーバーの証明書 openssl s_client -connect example.com:443 -servername example.com

-noout は、証明書そのもの(-----BEGIN CERTIFICATE----- で始まる部分)を出力しない指定です。付けないと、確認したい情報のあとに証明書全体が表示されます。

証明書ファイルの内容を見る

対象・発行者・有効期間

openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -noout -subject -issuer -dates -serial
subject=CN=lightscend.co.jp
issuer=C=US, O=Let's Encrypt, CN=YE2
notBefore=Sep 12 17:13:06 2026 GMT
notAfter=Dec 11 17:13:05 2026 GMT
serial=064F27F3A770A63F14663E5B8D092E13E231
項目 意味
subject 証明書の対象。CN(コモンネーム)にドメイン名が入る
issuer 発行した認証局(CA)
notBefore / notAfter 有効期間の開始 / 終了(GMT、日本時間は 9 時間足す)
serial シリアル番号。認証局に問い合わせるときなどに使う

日時の表示形式は -dateopt iso_8601 で変えられます(notAfter=2026-12-11 17:13:05Z のように表示されます)。

Let's Encrypt(Certbot)の場合、/etc/letsencrypt/live/ドメイン名/ に次のファイルがあります。

ファイル 中身
cert.pem サーバー証明書だけ
chain.pem 中間証明書
fullchain.pem サーバー証明書 + 中間証明書(Web サーバーに設定するのはこれ)
privkey.pem 秘密鍵

openssl x509 は、ファイルに証明書が複数入っていても先頭の 1 枚だけを読みます。fullchain.pem を指定した場合は、先頭のサーバー証明書の情報が表示されます。

対象のドメイン名(SAN)

ブラウザーが照合するのは、CN ではなく SAN(Subject Alternative Name)に書かれたドメイン名です。-ext は OpenSSL 1.1.1 以降で使えます。

openssl x509 -in cert.pem -noout -ext subjectAltName
X509v3 Subject Alternative Name: 
    DNS:lightscend.co.jp, DNS:www.lightscend.co.jp

アクセスする URL のドメイン名がここに無いと、ブラウザーは証明書のエラー(名前の不一致)を表示します。-ext には複数の拡張をカンマで並べられます(例: -ext keyUsage,extendedKeyUsage,basicConstraints)。

すべての内容

openssl x509 -in cert.pem -noout -text

出力の冒頭は次のようになります。公開鍵の種類(ここでは楕円曲線暗号の 256 ビット)や署名のアルゴリズムもここで確認できます。

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            06:4f:27:f3:a7:70:a6:3f:14:66:3e:5b:8d:09:2e:13:e2:31
        Signature Algorithm: ecdsa-with-SHA384
        Issuer: C=US, O=Let's Encrypt, CN=YE2
        Validity
            Not Before: Sep 12 17:13:06 2026 GMT
            Not After : Dec 11 17:13:05 2026 GMT
        Subject: CN=lightscend.co.jp
        Subject Public Key Info:
            Public Key Algorithm: id-ecPublicKey
                Public-Key: (256 bit)

フィンガープリント

証明書を一意に識別する値です。2 つのファイルが同じ証明書かどうかを比べるときなどに使います。-sha256 を付けないと SHA-1 の値が表示されます。

openssl x509 -in cert.pem -noout -fingerprint -sha256
sha256 Fingerprint=96:59:AA:5B:D9:79:1C:D2:99:69:8B:C8:17:5F:C3:DF:64:2A:75:1B:37:B1:6A:9B:46:81:D8:E6:06:38:B2:EC

DER 形式のファイル

拡張子が .der や .cer で、テキストエディターで開くと読めない文字が並ぶファイルは DER 形式(バイナリ)です。-inform DER を付けて読みます。

openssl x509 -in cert.der -inform DER -noout -subject -dates

期限切れが近いかを判定する

-checkend 秒数 は、指定した秒数のあとに有効期限が切れているかどうかを判定し、終了コードで返します。

openssl x509 -in cert.pem -noout -checkend 2592000   # 30日 = 2592000秒
echo $?
結果 表示 終了コード
指定した期間内には切れない Certificate will not expire 0
指定した期間内に切れる(すでに切れている場合も) Certificate will expire 1

終了コードを使うと、cron などで定期的に確認するスクリプトが書けます。

#!/bin/sh
CERT=/etc/letsencrypt/live/example.com/cert.pem
if ! openssl x509 -in "$CERT" -noout -checkend 2592000 >/dev/null; then
    echo "証明書の有効期限が30日以内です: $CERT"
fi

Let's Encrypt の証明書は通常 Certbot が自動で更新します。期限が近いのに更新されていない場合は、自動更新の設定を確認します(Certbotで証明書を自動更新する設定)。

Web サーバーが返している証明書を確認する

ファイルを更新しても、Web サーバーを再読み込みしていないと古い証明書が返り続けます。実際に返している証明書は openssl s_client で確認します。

openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null \
  | openssl x509 -noout -subject -issuer -enddate
subject=CN=lightscend.co.jp
issuer=C=US, O=Let's Encrypt, CN=YE2
notAfter=Dec 11 17:13:05 2026 GMT
  • -servername はアクセスするドメイン名(SNI)を送る指定です。1 台のサーバーで複数のドメインを運用している場合、サーバーはこの名前を見て返す証明書を選びます。OpenSSL 1.1.1 以降は -connect に書いたホスト名を自動で送りますが、IP アドレスで接続するときなどは -servername で明示します。
  • </dev/null は、接続したまま入力待ちになるのを防ぐためのものです。

接続と検証の結果をまとめて見る

openssl s_client -connect example.com:443 -servername example.com -brief </dev/null

出力の一部です。

CONNECTION ESTABLISHED
Protocol version: TLSv1.3
Ciphersuite: TLS_AES_256_GCM_SHA384
Peer certificate: CN=lightscend.co.jp
Hash used: SHA256
Signature type: ecdsa_secp256r1_sha256
Verification: OK

Verification: OK なら、サーバーが送った証明書のつながり(中間証明書を含む)を、OS に入っているルート証明書までたどって検証できています。失敗すると Verification error: のあとに理由が表示されます。

送られてくる中間証明書を確認する

openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null 2>/dev/null \
  | grep -E '^ *[0-9]+ s:|^ *i:'
 0 s:CN=lightscend.co.jp
   i:C=US, O=Let's Encrypt, CN=YE2
 1 s:C=US, O=Let's Encrypt, CN=YE2
   i:C=US, O=ISRG, CN=Root YE
 2 s:C=US, O=ISRG, CN=Root YE
   i:C=US, O=Internet Security Research Group, CN=ISRG Root X2
 3 s:C=US, O=Internet Security Research Group, CN=ISRG Root X2
   i:C=US, O=Internet Security Research Group, CN=ISRG Root X1

s: が各証明書の対象、i: がその発行者です。0 番の発行者が 1 番の対象、というようにつながっていれば正しい順番です。0 番だけしか表示されない場合は、Web サーバーに中間証明書が設定されていません(Nginx なら cert.pem ではなく fullchain.pem を指定します)。詳しくは 中間証明書が不足しているときの対処 を参照してください。

ファイルに入っている複数の証明書を一覧する

fullchain.pem のように複数の証明書が入ったファイルの中身を 1 枚ずつ見るには、次のようにします。

openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout
subject=CN=lightscend.co.jp
issuer=C=US, O=Let's Encrypt, CN=YE2

subject=C=US, O=Let's Encrypt, CN=YE2
issuer=C=US, O=ISRG, CN=Root YE

中間証明書を含めて検証する

サーバー証明書のファイルが、中間証明書を使って信頼できるルート証明書までたどれるかを確かめます。

openssl verify -untrusted chain.pem cert.pem
cert.pem: OK

-untrusted には中間証明書のファイルを指定します。ルート証明書は OS の証明書ストアのものが使われます。中間証明書が足りないと error 20 at 1 depth lookup: unable to get local issuer certificate のように失敗します。

ドメイン名が SAN に含まれるかも一緒に確かめられます。

openssl verify -untrusted chain.pem -verify_hostname example.com cert.pem

含まれていなければ error 62 at 0 depth lookup: hostname mismatch になります。

証明書と秘密鍵が組み合っているか確かめる

Web サーバーが「鍵が一致しない」というエラーで起動しない場合は、証明書と秘密鍵から取り出した公開鍵を比べます。2 つのハッシュ値が同じなら組み合っています。RSA・楕円曲線のどちらの鍵でも使えます。

openssl x509 -in cert.pem -noout -pubkey | openssl sha256
openssl pkey -in privkey.pem -pubout | openssl sha256

証明書を申請する前の CSR(証明書署名要求)の内容は、次のように確認します。

openssl req -in request.csr -noout -subject -verify

注意点

  • 秘密鍵のファイル(privkey.pem など)は、確認のためでも他人に送ったりチャットに貼ったりしないでください。証明書(公開される情報)とは扱いが異なります。
  • openssl s_client で見えるのは、そのとき接続した 1 台のサーバーの証明書です。ロードバランサーや CDN の後ろに複数台ある場合は、台ごとに確認が必要なことがあります。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲