opensslで証明書・鍵・CSR・接続を確認するコマンド総まとめ

証明書や鍵まわりで困ったら、だいたい openssl コマンドで中身を確認すれば解決します。 この記事は、「確認」系の openssl コマンドを用途別に総ざらいしたチートシートです。コピペで使ってください。実際の出力例と、つまずきやすいエラー例も載せました。

この記事は OpenSSL 3.x(手元は 3.6.2)で実際に実行して確認しています。openssl version で自分の版を確認できます。古い 1.0.x 系だと一部オプションの既定が違うことがあります。出力例の証明書はこの記事用に作ったテスト用(www.example.com)なので、値はお手元のものに読み替えてください。

0. インストール

# macOS(Homebrew)
brew install openssl

# Linux(RedHat/CentOS/Rocky/Alma 系)
sudo dnf install openssl       # 古い環境は: sudo yum install openssl

# Linux(Debian/Ubuntu 系)
sudo apt-get install openssl
openssl version        # バージョン確認
OpenSSL 3.6.2 7 Apr 2026 (Library: OpenSSL 3.6.2 7 Apr 2026)

1. 証明書(crt / cer / pem)の中身を見る

全体をテキストで表示

openssl x509 -in cert.pem -noout -text

冒頭はこんな見た目です(長いので先頭だけ)。

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            28:a2:ca:d3:82:0c:26:a9:4a:59:0b:a1:be:1d:68:2f:48:53:cf:c8
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=JP, O=Example CA, CN=Example Intermediate CA
        Validity
            Not Before: Jun 24 13:48:19 2026 GMT
            Not After : Jun 24 13:48:19 2027 GMT
        Subject: C=JP, O=Example Inc, CN=www.example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)

DER(バイナリ)の証明書なら -inform der を付けます。

openssl x509 -inform der -in cert.der -noout -text

よく見たい項目だけピンポイントで

# 有効期限(開始・終了)
openssl x509 -in cert.pem -noout -dates
notBefore=Jun 24 13:48:19 2026 GMT
notAfter=Jun 24 13:48:19 2027 GMT
# 持ち主(Subject)と発行者(Issuer)
openssl x509 -in cert.pem -noout -subject -issuer
subject=C=JP, O=Example Inc, CN=www.example.com
issuer=C=JP, O=Example CA, CN=Example Intermediate CA
# コモンネーム/SAN(対応ドメイン)
openssl x509 -in cert.pem -noout -ext subjectAltName
X509v3 Subject Alternative Name: 
    DNS:www.example.com, DNS:example.com
# フィンガープリント(指紋。証明書を一意に表すハッシュ値)
openssl x509 -in cert.pem -noout -fingerprint -sha256
sha256 Fingerprint=24:05:09:37:66:CC:51:90:F6:71:20:E6:25:E6:1F:FE:36:D2:72:47:23:36:1C:0B:17:D3:36:F9:20:96:FC:9A

SHA-1 のフィンガープリント(-sha1)も出せますが、SHA-1 は弱いのでいまは SHA-256 を基本に。

証明書が「いつ失効するか」を残り日数で確認

# 証明書が30日以内に切れるなら exit code 1(監視スクリプト向け)
openssl x509 -in cert.pem -noout -checkend $((30*24*60*60))

まだ余裕があれば次のように出て、終了コードは 0

Certificate will not expire

すでに切れている/指定期間内に切れる場合は、こう出て終了コードが 1 になります。スクリプトはこの終了コードで判定します。

Certificate will expire
# 終了コードだけ見たいとき
openssl x509 -in cert.pem -noout -checkend 0 ; echo "exit=$?"   # exit=0 なら有効、exit=1 なら失効済み

2. 秘密鍵(key)の中身を見る

秘密鍵は RSA だけでなく EC(楕円曲線)も普及しています。鍵の種類を問わない openssl pkey が便利です。

# 汎用(RSA/EC どちらでもOK)。鍵の中身を表示
openssl pkey -in key.pem -noout -text

# RSA鍵に限定した昔ながらのコマンド(今も使える)
openssl rsa -in key.pem -noout -text

# EC鍵
openssl ec -in key.pem -noout -text

鍵が壊れていないか/パスフレーズが合っているか確認

openssl pkey -in key.pem -noout -check

健全なら一言だけ返ります。

Key is valid

パスフレーズ付きの鍵なら、ここでパスフレーズを聞かれます。通れば鍵は健全です。


3. 証明書と秘密鍵が「ペアかどうか」確認する

「サーバ証明書」と「秘密鍵」がちゃんと対になっているかは、トラブルの定番チェックです。 同じ公開鍵(の指紋)が出れば一致しています。

# 証明書側の公開鍵の指紋
openssl x509 -in cert.pem -noout -pubkey | openssl pkey -pubin -outform der | openssl dgst -sha256

# 秘密鍵側の公開鍵の指紋
openssl pkey -in key.pem -pubout -outform der | openssl dgst -sha256

ペアなら、2つのハッシュ値がぴったり一致します。

SHA2-256(stdin)= 719f234ab37d1a37eb91711e3523ff20d190eb14c9c257ba4f55d05113b05d42
SHA2-256(stdin)= 719f234ab37d1a37eb91711e3523ff20d190eb14c9c257ba4f55d05113b05d42

ペアでない(証明書と鍵が食い違っている)場合は、値が変わって一致しません。「鍵と証明書が合っていない」エラーの正体はこれです。

SHA2-256(stdin)= 719f234ab37d1a37eb91711e3523ff20d190eb14c9c257ba4f55d05113b05d42
SHA2-256(stdin)= 46b4dfa6ec12127eaae40cc8ff77f26b83940d29271f56b552594b09e3f5e56d   ← 違う鍵

古い記事では openssl x509 -modulusopenssl rsa -modulus の MD5 を比べる方法が有名ですが、これは RSA 鍵専用です。EC鍵にも効く上のやり方を覚えておくと安心です。


4. CSR(証明書署名要求)の中身を見る

openssl req -in request.csr -noout -text

# 申請先のドメイン・組織(Subject)だけ確認
openssl req -in request.csr -noout -subject
subject=C=JP, O=Example Inc, CN=www.example.com
# CSR の署名が壊れていないか検証
openssl req -in request.csr -noout -verify
Certificate request self-signature verify OK

5. PEM に何が入っているか一覧する

1つの pem に証明書や鍵が複数連結されていると、何が入っているか分かりにくいもの。 OpenSSL 3.x の storeutl でまとめて列挙できます。

openssl storeutl -noout -text bundle.pem

証明書だけを順番に確認したいときは、こんな手もあります。

# bundle.pem に含まれる証明書すべての Subject/Issuer を一覧
openssl crl2pkcs7 -nocrl -certfile bundle.pem | \
  openssl pkcs7 -print_certs -noout

サーバ証明書 → 中間証明書の順に、誰が誰に署名したか(チェーン)が読み取れます。

subject=C=JP, O=Example Inc, CN=www.example.com
issuer=C=JP, O=Example CA, CN=Example Intermediate CA

subject=C=JP, O=Example CA, CN=Example Intermediate CA
issuer=C=JP, O=Example CA, CN=Example Root CA

subject(持ち主)と次の証明書の関係を見ると、www.example.com を中間CAが署名し、その中間CAをルートCAが署名している、という連鎖が分かります。チェーンの考え方は PKI入門 を参照。


6. サーバに繋いで証明書を確認する(s_client)

ファイルが手元になくても、動いているサーバに繋いで証明書を確認できます。トラブル調査でいちばん使います。

# サーバの証明書チェーンを表示
openssl s_client -connect www.example.com:443 -servername www.example.com </dev/null

# 証明書部分だけ取り出して有効期限を見る
openssl s_client -connect www.example.com:443 -servername www.example.com </dev/null 2>/dev/null \
  | openssl x509 -noout -dates -subject -issuer
  • -servername(SNI)は、1つのIPで複数サイトを配信している今どきのサーバではほぼ必須です。付けないと別の証明書が返ることがあります。
  • -showcerts を付けると中間証明書まで全部表示され、チェーンの設置漏れを確認できます。
openssl s_client -connect www.example.com:443 -servername www.example.com -showcerts </dev/null

証明書チェーンの検証

openssl s_client -connect www.example.com:443 -servername www.example.com </dev/null 2>/dev/null \
  | grep -i "Verify return code"
Verify return code: 0 (ok)

0 (ok) 以外が出たら検証失敗です。よく出るのは中間証明書の設置漏れによる 21 (unable to verify the first certificate) で、サーバ側に中間証明書を連結すれば直ります。


7. PFX / p12(証明書+鍵の束)の中身を見る

# 中身を表示(パスワードを聞かれる)
openssl pkcs12 -in cert.pfx -info -noout
MAC: sha256, Iteration 2048
MAC length: 32, salt length: 16
PKCS7 Encrypted data: PBES2, PBKDF2, AES-256-CBC, Iteration 2048, PRF hmacWithSHA256
Certificate bag
Certificate bag
PKCS7 Data
Shrouded Keybag: PBES2, PBKDF2, AES-256-CBC, Iteration 2048, PRF hmacWithSHA256

Certificate bag(証明書)と Shrouded Keybag(暗号化された秘密鍵)が、1ファイルに同梱されているのが分かります。

PFX を PEM に取り出す/PEM から PFX を作るなどの変換は、別記事にまとめています。

PEM ⇄ DER / CRT / KEY / PFX(p12) 変換opensslワンライナー集


8. よくあるエラーと原因

実行ミスでよく出るメッセージと、その意味です。

形式の指定ミス(PEM なのに -inform der)

openssl x509 -inform der -in cert.pem -noout -text
Could not find certificate from cert.pem
... DECODER routines:OSSL_DECODER_from_bio:unsupported: ... Input type: DER

→ ファイルは PEM(テキスト)なのに DER(バイナリ)として読もうとしています。-inform der を外す(PEM はそのまま読めます)。逆に DER ファイルに -inform der を付け忘れた場合も同種のエラーになります。file cert.pem や先頭の -----BEGIN の有無で形式を見分けましょう(形式まとめ)。

PFX のパスワード違い

openssl pkcs12 -in cert.pfx -info -noout -passin pass:wrongpass
Mac verify error: invalid password?

→ PFX のパスワードが違います。書き出したときのパスワードを確認してください。

「鍵と証明書が一致しない」

サーバ起動時に key values mismatch などと言われたら、3章のペア確認で指紋を突き合わせます。値が食い違っていれば、証明書か鍵のどちらかが別物です。


さいごに

  • 証明書 → openssl x509、鍵 → openssl pkey、CSR → openssl req、サーバ直 → openssl s_client。この4つを押さえればだいたい確認できます。
  • ファイル形式そのものの違い(PEM/DER/PFX…)は 証明書ファイルの形式まとめ、鍵と証明書の関係は PKI入門 をどうぞ。
  • pem 単体の中身確認の基本は pem ファイルとは? にあります。