Security

PKCS #12 形式の証明書ファイルに対するコマンド操作

投稿日:2020年7月22日 更新日:

1. はじめに

本記事では、PKCS #12形式のサーバ証明書ファイルに対するコマンド操作について説明します。

openssl コマンドを利用します。

2. PKCS #12 形式の証明書について

  • SSL/TLS サーバ証明書ファイルの形式の1つですが、1つのファイルに、サーバ証明書に加えて「秘密鍵」「中間CA証明書」も含めることができます。つまり、ウェブサーバーのSSL/TLS設定に必要なすべてのファイルを1つにまとめることができます。但し、中間CA証明書を含めるかどうかは任意です。
  • PKCS #12形式の証明書ファイルには、1つのパスワードを設定します。このパスワードがないと利用することができません。このパスワードは、秘密鍵のパスフレーズとは別です。PKCS #12 形式の証明書ファイルを利用する上で、秘密鍵のパスフレーズは必要ありません。(PKCS #12 形式の証明書ファイルを生成する際には、秘密鍵のパスフレーズが必要です。またこのときに PKCS #12 形式用のパスワードをセットします。)
  • 拡張子は、.pfx.p12 です。

参考

3. 本記事で使用するファイル名

本記事のコマンドで指定されるファイル名とその種類は以下となっています。

ファイル名 種類
private.key 秘密鍵(PEM形式)
server.pfx サーバ証明書(PKCS #12形式)
server.crt サーバ証明書(PEM形式)
intermediate.crt 中間CA証明書(PEM形式)
fullchain.pem 秘密鍵、サーバ証明書、中間CA証明書がまとめて含まれるファイル(PEM形式)

4. PKCS #12 形式の証明書に含まれる情報をPEM形式で表示する openssl コマンド

4-1. 証明書ファイルに含まれる情報をPEM形式で表示する。

コマンド

openssl pkcs12 -in server.pfx -info -nodes
  • このコマンドを実行すると、証明書のパスワードの入力が求められます。
  • 証明書ファイルの拡張子は、.p12 の場合もあります。

実行例

$ openssl pkcs12 -in server.pfx -info -nodes
Enter Import Password:
MAC: sha1, Iteration 2048
MAC length: 20, salt length: 8
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
Bag Attributes
    localKeyID: B7 3F B2 BC 66 4C 80 2B 88 5A 8F C8 08 66 2F 4D 20 3D 26 DE 
subject=CN = misc.laboradian.com

issuer=C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3

-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
(省略、Base64 された文字列)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
Certificate bag
Bag Attributes: 
subject=C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3

issuer=O = Digital Signature Trust Co., CN = DST Root CA X3

-----BEGIN CERTIFICATE-----
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
(省略、Base64 された文字列)
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
-----END CERTIFICATE-----
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048
Bag Attributes
    localKeyID: B7 3F B2 BC 66 4C 80 2B 88 5A 8F C8 08 66 2F 4D 20 3D 26 DE 
Key Attributes: 
-----BEGIN PRIVATE KEY-----
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
(省略、Base64 された文字列)
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
ZZZZZZZZZZZZZZZZZZZZZZZZ
-----END PRIVATE KEY-----

この出力の中で、色のついた部分について簡単に説明します。

データの種類 説明
サーバ証明書
  • subject(主体)は「misc.laboradian.com
  • issuer(発行者)は「Let’s Encrypt Authority X3
  • この証明書は subject が発行した証明書であり、issuer が署名を行っています。
  • この発行者が、以下の中間CA証明書の主体となっています。
中間CA証明書
  • subject(主体)は「Let’s Encrypt Authority X3
  • issuer(発行者)は「DST Root CA X3
  • この証明書は subject が発行した証明書であり、issuer が署名を行っています。
  • この発行者はルートCAであり、このルートCAが発行している自己署名証明書は、一般的なウェブブラウザに組み込まれているはずです。
秘密鍵
  • 上のサーバ証明書を作成する際に利用した秘密鍵です。
  • misc.laboradian.com の所有者のみが持っています。
  • サーバ証明書が、misc.laboradian.com の所有者が発行したものかどうかを確かめるために利用されます(本人確認)。

4-2. 証明書ファイルに含まれる情報をPEM形式で表示する(秘密鍵は暗号化)

コマンド

openssl pkcs12 -in server.pfx -info
  • 先ほどとは違い、-nodes オプションを指定していません。
  • このコマンドを実行すると、証明書のパスワードの入力が求められます。
  • 但し、暗号化した文字列で秘密鍵を表示するために、暗号化に使うパスフレーズを聞いてきます(Enter PEM pass phrase:)。これは何でもよいです。なんだか面倒なことをしていますが、秘密鍵はそれ程重要な情報だということだと思います。

実行例

$ openssl pkcs12 -in server.pfx -info
Enter Import Password:
MAC: sha1, Iteration 2048
MAC length: 20, salt length: 8
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
Bag Attributes
    localKeyID: B7 3F B2 BC 66 4C 80 2B 88 5A 8F C8 08 66 2F 4D 20 3D 26 DE 
subject=CN = misc.laboradian.com

issuer=C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3

-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
(省略、Base64 された文字列)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
Certificate bag
Bag Attributes: 
subject=C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3

issuer=O = Digital Signature Trust Co., CN = DST Root CA X3

-----BEGIN CERTIFICATE-----
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
(省略、Base64 された文字列)
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
-----END CERTIFICATE-----
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048
Bag Attributes
    localKeyID: B7 3F B2 BC 66 4C 80 2B 88 5A 8F C8 08 66 2F 4D 20 3D 26 DE 
Key Attributes: 
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----BEGIN ENCRYPTED PRIVATE KEY-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
(省略、暗号化された文字列)
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA
-----END ENCRYPTED PRIVATE KEY-----
  • 先ほどと異なる部分を赤色にしています。
  • 秘密鍵の情報を出力する直前で、「PEM pass phrase」の入力が促されています。入力後は、このパスフレーズを使って秘密鍵の情報は暗号化され、先ほどは「-----BEGIN PRIVATE KEY-----」だった部分も「-----BEGIN ENCRYPTED PRIVATE KEY-----」と ENCRYPTED が追加されています。

5. PKCS #12 形式の証明書から、秘密鍵を取り出す

5-1. 秘密鍵(PEM形式)を取り出す

コマンド

openssl pkcs12 -in server.pfx -nocerts -nodes -out private.key
  • -nodes オプションによって、「暗号化なし」を指示しています。
  • このコマンドを実行すると、証明書のパスワードの入力が求められます。
  • 暗号化なしの秘密鍵なので、出力には「-----BEGIN PRIVATE KEY-----」が含まれます。

5-2. 秘密鍵(PEM形式、暗号化)を取り出す

コマンド

openssl pkcs12 -in server.pfx -nocerts -out private-encrypted.key
  • このコマンドを実行すると、証明書のパスワードの入力が求められます。
  • その直後には、暗号化するためのパスフレーズ(PEM pass phrase)の入力が求められます。
  • 暗号化ありの秘密鍵なので、出力には「-----BEGIN ENCRYPTED PRIVATE KEY-----」が含まれます。

6. PKCS #12 形式の証明書から、サーバ証明書(PEM形式)を取り出す

コマンド

openssl pkcs12 -in server.pfx -clcerts -nokeys -out server.crt
  • 出力には「-----BEGIN CERTIFICATE-----」が含まれます。

7. PKCS #12 形式の証明書から、中間CA証明書(PEM形式)を取り出す

コマンド

openssl pkcs12 -in cert.pfx -cacerts -nokeys -out intermediate.crt
  • 出力には「-----BEGIN CERTIFICATE-----」が含まれます。

8. PKCS #12 形式の証明書から、各種情報(PEM形式)をまとめて取り出す

コマンド

openssl pkcs12 -in cert.pfx -nodes -out fullchain.pem
  • 出力には、サーバ証明書と中間CA証明書の「-----BEGIN CERTIFICATE-----」がそれぞれ含まれ、秘密鍵の「BEGIN PRIVATE KEY」も含まれます。
  • -nodes オプションを指定しなければ、秘密鍵は暗号化された状態で出力されます(暗号化に必要なパスフレーズが求められます)。

9. PEM形式のサーバ証明書と秘密鍵(と中間CA証明書)をPKCS #12形式に変換する

コマンド

openssl pkcs12 \
  -export \
  -inkey private.key \
  -in server.crt \
  -certfile intermediate.crt \
  -out server.pfx
  • コマンドを実行すると、PKCS #12形式用のパスワードの指定が促されます。
  • 引数で指定した秘密鍵が暗号化されている場合は、それに対するパスフレーズの入力も求められます。

実行例

$ openssl pkcs12 \
  -export \
  -inkey private.key \
  -in server.crt \
  -certfile intermediate.crt \
  -out server.pfx
Enter pass phrase for private.key:
Enter Export Password:
Verifying - Enter Export Password:
  • Export Password というのが PKCS #12形式ようのパスワードで、この証明書を利用するには、このパスワードが必要になります。

10. おわりに

PKCS #12形式は、秘密鍵・サーバー証明書・中間CA証明書を1つのファイルで管理することができる大変便利な形式です。しかし、対応しているウェブサーバーが少ないので必要になることは少ないかもしれません。

11. 参考

📂-Security

執筆者:labo


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

セキュリティに関連するリンク集

情報は随時追加します。 目次毎日チェックするとよいウェブページ一般Webアプリケーション関連WordPress関連インシデント 毎日チェックするとよいウェブページ IPA 独立行政法人 情報処理推進機 …

no image

バッファオーバーフロー by IPA「安全なウェブサイトの作り方 第7版」

安全なウェブサイトの作り方:IPA 独立行政法人 情報処理推進機構の、「バッファオーバーフロー 」から一部抜粋する。(この資料はPDFでしか提供されていない) 目次注意が必要なウェブサイトの特 …

no image

SQLインジェクション対策 by IPA「安全なウェブサイトの作り方 第7版」

photo credit: Injection, Inject via photopin (license) 安全なウェブサイトの作り方:IPA 独立行政法人 情報処理推進機構の、「SQLインジェクシ …

no image

IPA の「CMSを用いたウェブサイト構築における情報セキュリティ対策 4つのポイント」の重要な部分を抜粋する

目次1. はじめに2. CMS を構築されたウェブサイトを狙う攻撃と対策2.1. 脆弱性やウェブサイトの運用上の不備を悪用2.1.1. ソフトウェアの脆弱性2.1.2. 運用上の不備2.2. 認証を突 …

no image

HTML Purifier の使い方

目次HTML Purifier についてComposerで使う方法1. composer.json の require に、以下を追記する2. composer update する3. 実際に使うHT …