[OpenSSL] pem ファイルとは?SSL証明書の中身を確認する方法

iOS開発でのサーバ側 push通知設定や、WebサーバのSSL証明書設定に使われる .pem ファイルの中身を確認する時に便利なコマンドをまとめました。

  1. pem ファイルとは?
  2. openssl コマンドのインストール方法
  3. pem ファイルに含まれる証明書の確認方法
  4. 秘密鍵の内容を表示する
  5. pemファイルの作り方
  6. PEMファイルの開き方
  7. (おまけ)csrの情報を出力する

pemと同様に使われる.p12ファイルの確認方法は下の記事でまとめてます。

[IOS][OPENSSL] .P12キーストアファイル証明書の中身を確認する

pem ファイルとは?

「鍵」と「証明書」がそもそも何者で、認証局(CA)とどうつながるのかが曖昧な方は 公開鍵・秘密鍵・証明書の関係をやさしく図解(PKI入門) を、.pem.crt .der .pfx など拡張子の違いは 証明書ファイルの形式まとめ をどうぞ。

pemファイルは証明書とか鍵とか、サイトによってバラバラな書き方をされているので、何者かよくわからなくなります。

pem って証明書、鍵どっちなの?という疑問を持たれる方もいますが、pemファイルは鍵になることも証明書になること、両方になることも出来ます。

というのも、pemとはただのファイル書式が決まった入れ物のことで、証明書、鍵をいくつでも含めることができるからです。
pem の書式はシンプルで、任意の証明書、鍵をbase64エンコードして以下のBEGIN/END行で挟んでつなげただけのテキストファイルです。

pem の書式(鍵+証明書)

—–BEGIN RSA PRIVATE KEY—–
鍵ファイルのbase64エンコード
—–END RSA PRIVATE KEY—–
—–BEGIN CERTIFICATE—–
証明書ファイルのbase64エンコード
—–END CERTIFICATE—–

pem の例(証明書+鍵):

—–BEGIN CERTIFICATE—–
MIIGQTCCBSmgAwIBAgIIM5HjhF+86iswDQYJKoZIhvcNAQELBQAwgZYxCzAJBgNV
BAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3Js
・・・略・・・
HqrtjOPEFu2v5H++eeyw9WTXhfOD2H6t/pXD6A62E6O0q21FiIZnITQlxvDCLqq6
I+0w8Lymm9iXGYdxzm6tCEekpzYyJ5TiiMGKMCez8IjFq7hrEqiARoE0U7zR1JOP
qPTsfdoBrs5Wr8szzLo6NMMLknnT
—–END CERTIFICATE—–
—–BEGIN RSA PRIVATE KEY—–
MIIEowIBAAKCAQEAuvvBkPx5p5HIRbSnihQAlGP8CKTrH+981nMhU93OWWBzmXBT
IULoO2Ah2a57H3Kxt5UHzyvawqGXOMgYk5SYq13Wnd7yqQA5JIKg+3jS2vd2C8oQ
・・・略・・・
SV4ZZCLL0FlWadPo3NVD0nnw5JvepABwdMQzCk/47efVA8LugjBGApWSpyCEEqRk
1uS4FuJSyQGczMcHLnVHBhlyfTt6DtFtwFqI3coimOU1cQj0Gg9w
—–END RSA PRIVATE KEY—–

このままでは人の目では証明書・鍵の情報が見えないので、それを見やすくするには openssl コマンドを使います。

openssl コマンドのインストール方法

Mac OS X:

Homebrew からインストールできます。

brew install openssl

Linux(CentOS, RedHat系):

sudo yum install openssl

Linux(Ubuntu, Debian系):

sudo apt-get install openssl

pem ファイルに含まれる証明書の確認方法

有効期限・発行者・SAN・鍵とのペア確認・サーバへの s_client 接続まで、確認系コマンドの総まとめは opensslで証明書・鍵・CSR・接続を確認するコマンド総まとめ にあります。

証明書の中身(期限、フィンガープリント)を確認したい場合、このコマンドを使います。
証明書単体のcrtファイルも同じ方法で確認できます。

openssl x509 -text -fingerprint -noout -in “ファイル名.pem”


結果:

Certificate:
Data:
Version: 1 (0x0)
Serial Number:
d0:c9:5c:fc:4e:3c:b4:db
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=JP, ST=Some-State, O=foo, Inc.
Validity
Not Before: Feb 13 11:07:40 2017 GMT
Not After : Feb 11 11:07:40 2027 GMT
Subject: C=JP, ST=Some-State, O=foo, Inc.
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (4096 bit)
Modulus (4096 bit):
00:c3:d4:4c:d2:af:dc:28:48:9e:d6:13:16:64:06:
e2:1e:84:d9:2c:93:bd:f9:b6:20:3e:f5:94:a1:28:
6e:9c:ea:ed:34:54:33:38:93:0c:19:9c:48:c8:4e:
7d:f3:ef:2f:ee:63:9b:10:4c:93:95:fa:59:e6:9e:
ee:b1:6e:52:69:1a:1f:7a:8b:8c:4f:0d:ce:65:dd:
中略
f2:b4:05
Exponent: 65537 (0x10001)
Signature Algorithm: sha1WithRSAEncryption
b8:a8:49:f7:85:83:bd:5a:4c:b7:eb:53:4b:fa:3d:81:ed:d7:
84:fe:74:ec:c4:be:de:3b:d2:1d:0a:d9:7a:f0:25:21:83:ee:
中略
3d:ae:75:1d:d7:86:69:d4
SHA1 Fingerprint=8C:FA:F1:AA:CC:92:B3:C6:76:C1:89:BA:95:62:3B:19:C2:F5:DB:5B

Validity
Not Before: Feb 13 11:07:40 2017 GMT
Not After : Feb 11 11:07:40 2027 GMT

が証明書の有効期間(開始〜有効期限)

Subject: C=JP, ST=Some-State, O=foo, Inc.


が証明書にかかれているドメイン、会社名、住所などの情報です。

最後の SHA1 Fingerprint がSHA1ハッシュの署名(フィンガープリント)です。

※補足: フィンガープリントは、いまは SHA-256 が基本です。openssl x509 -fingerprint -sha256 -in cert.pem -noout で出せます(コマンド総まとめ参照)。

秘密鍵の内容を表示する

pemファイル内の秘密鍵や、秘密鍵単体の.keyファイルの中身を表示するには openssl rsa コマンドを使います。

openssl rsa -text -noout -in “ファイル名.pem”

結果:

Private-Key: (4096 bit)
modulus:
00:c3:d4:4c:d2:af:dc:28:48:9e:d6:13:16:64:06:
e2:1e:84:d9:2c:93:bd:f9:b6:20:3e:f5:94:a1:28:

publicExponent: 65537 (0x10001)
privateExponent:
64:e9:c6:1c:dc:1a:eb:77:60:c2:98:5b:75:78:46:
95:cb:87:ce:7c:e3:ed:06:79:5f:78:55:fb:26:46:

prime1:
00:e8:2b:bb:d4:e0:5e:40:0b:bc:9a:a4:b1:1d:6f:
79:cd:3b:cd:dd:68:9a:f6:cd:25:1c:f1:2a:c2:62:

prime2:
00:d7:ed:b2:2b:ab:59:df:9f:81:9d:36:ed:dc:3c:
7c:7e:59:94:9c:1c:aa:ce:61:92:3b:70:14:72:0a:

exponent1:
00:df:78:60:f6:38:f4:5f:3f:2c:cd:c8:e1:f6:0c:
3b:b7:f0:ed:69:44:eb:8b:cc:d0:01:38:9c:c8:b7:

exponent2:
0e:76:c7:a6:91:35:d5:fa:f3:4d:ba:ae:38:40:7c:
fe:61:b5:c8:b7:4a:e1:c4:3b:6d:6b:d6:92:c5:15:

coefficient:
40:53:83:96:f9:ca:da:86:5f:b8:b5:db:2f:46:71:
d3:ab:eb:68:c1:dd:c1:5b:8d:79:93:e9:a2:42:37:

pemファイルの作り方

「pfx を pem に」「DER を PEM に」「crt と key を1つに」など、別形式への変換は PEM ⇄ DER / CRT / KEY / PFX(p12) 変換 openssl ワンライナー集 にまとめています。

前述のとおり、pem はただ鍵や証明書などbase64エンコードしてつなげただけのファイルですので、
pem ファイルに格納したい鍵ファイル、証明書ファイルがあれば cat コマンドなどで簡単にpemファイルを作成できます。

鍵ファイル server.key と証明書ファイル server1.crt、server2.crt を結合してpemにまとめる例:

cat server.key server1.crt server2.crt > server.pem

PEMファイルの開き方

PEMファイルは Base64 のテキストなので、開くだけならメモ帳やテキストエディタでそのまま開けます。中身は -----BEGIN CERTIFICATE----- のようなブロックが並んでいて、1つのファイルに証明書と鍵、中間証明書が複数入っていることもあります。

ただしテキストで開いても中身は暗号化された文字列で、有効期限や発行者はわかりません。人が読める形で確認するには openssl を使います。

# 証明書の中身を読む
openssl x509 -in cert.pem -noout -text

# 秘密鍵の中身を読む(RSA / EC どちらも openssl pkey でOK)
openssl pkey -in key.pem -noout -text

# CSR の中身を読む
openssl req -in request.csr -noout -text

1つのPEMに複数のものが入っているときは、まとめて一覧できます。

openssl storeutl -noout -text file.pem

拡張子が .pem でも中身がバイナリ(DER)のことがあります。テキストエディタで開いて文字化けするなら DER なので、その場合の見方や変換は下の関連記事にまとめました。

あわせて読みたい(関連記事)

この記事のコマンドは現在の OpenSSL 3.x でもそのまま使えます。証明書のフィンガープリントは、いまは SHA-256 が基本です(openssl x509 -fingerprint -sha256)。

「pem の中身を確認する」ところから一歩進みたい人向けに、目的別の記事を用意しました。

(おまけ)csrの情報を出力する

pemとは関係ありませんが、証明書に関連して、
証明書発行リクエストに使うCSRファイルの情報出力方法も紹介します。

openssl req -text -noout -in ファイル名.csr


結果:

Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=JP, ST=Some-State, O=foo, Inc.
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (4096 bit)
Modulus (4096 bit):
00:c3:d4:4c:d2:af:dc:28:48:9e:d6:13:16:64:06:
e2:1e:84:d9:2c:93:bd:f9:b6:20:3e:f5:94:a1:28:

Exponent: 65537 (0x10001)
Attributes:
a0:00
Signature Algorithm: sha1WithRSAEncryption
c1:e6:80:e4:63:d1:10:8a:f8:e4:26:33:a4:6f:62:58:66:e6:
69:56:7a:d8:e6:e5:6b:fa:63:14:cf:6d:fa:aa:76:02:59:9f:

さいごに

証明書、鍵関係で困ったらopensslコマンドですね。便利。