iOS開発でのサーバ側 push通知設定や、WebサーバのSSL証明書設定に使われる .pem ファイルの中身を確認する時に便利なコマンドをまとめました。
- pem ファイルとは?
- openssl コマンドのインストール方法
- pem ファイルに含まれる証明書の確認方法
- 秘密鍵の内容を表示する
- pemファイルの作り方
- PEMファイルの開き方
- (おまけ)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 の中身を確認する」ところから一歩進みたい人向けに、目的別の記事を用意しました。
- 公開鍵・秘密鍵・証明書の関係をやさしく図解(PKI入門) … そもそも「鍵」と「証明書」が何者で、認証局(CA)やチェーンとどうつながるのかを図で整理。
- 証明書ファイルの形式まとめ(PEM / DER / PFX / CRT / CER / KEY / CSR の違い) … 紛らわしい拡張子を「テキストかバイナリか」×「中身は証明書か鍵か」で整理。
- opensslで証明書・鍵・CSR・接続を確認するコマンド総まとめ … 有効期限・発行者・SAN・鍵とのペア確認・s_client まで、確認系コマンドを実際の出力例つきで網羅。
- PEM ⇄ DER / CRT / KEY / PFX(p12) 変換 openssl ワンライナー集 … 「pfx を pem に」「crt と key を1つに」など、形式変換を逆引き。
- .p12 キーストアファイルの中身を確認する … iOS などで使う
.p12(PKCS#12)の中の証明書・鍵を openssl で確認する方法。 - 証明書と秘密鍵から p12 ファイルを作る … 逆に、pem の証明書と鍵をまとめて
.p12にする手順。
(おまけ)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コマンドですね。便利。