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

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

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

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

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

pem ファイルとは?

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 ファイルに含まれる証明書の確認方法

証明書の中身(期限、フィンガープリント)を確認したい場合、このコマンドを使います。
証明書単体の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ハッシュの署名(フィンガープリント)です。

秘密鍵の内容を表示する

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ファイルの作り方

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

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

cat server.key server1.crt server2.crt > server.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コマンドですね。便利。