Open3

いい加減 iOSの証明書周りを理解したいのでまとめていく

kamimikamimi

証明書まわりで良く聞くファイル(拡張子で)

  • p12
  • pem
  • cer
  • p8
  • mobileprovision

証明書ではないが合わせて学びたいもの

  • match
  • iOSのプッシュ
kamimikamimi

共通で知っておくべき知識

.DERと .PEMという拡張子は鍵の中身じゃなくて、エンコーディングを表している

.DER
鍵や証明書をASN.1というデータ構造で表し、それをシリアライズしたバイナリファイルです。

.PEM
.DERと同じASN.1のバイナリデータをBase64によってテキスト化されたファイルです。
・ファイルの先頭に -- BEGIN... という行があるのをみたら「PEMだな」と思えば良いです。
opensslコマンドのデフォルトのエンコーディングなので、たとえば何も指定せずに鍵を生成すると PEM形式のファイルが作られます。


.CRT .CER .KEY .CSRはファイルのエンコーディングではなく内容を表している

.CRT
・Certificate、つまり証明書であることを示しています。
・エンコーディングは DERだったり PEMだったりします。中身がテキストファイルなら PEMと思えばいいでしょう。
・証明書というのは何を証明しているかというと、 公開鍵が誰の公開鍵であるかを証明している ものです。なので、中身には公開鍵も含まれています。公開鍵と言いながら .CRTファイルを扱っているケースがあるのはそのためです。
証明書=署名付き公開鍵 と言ってもいいかもしれません

.CER
・こちらも Certificateの略、つまり証明書です。マイクロソフトが使っている拡張子の取り決めで使われています。
中身は.CRTと同じです。

.KEY
・そのまま「鍵」です。公開鍵、あるいは秘密鍵であることを表しています。
・エンコーディングは DERあるいは PEMです。

https://qiita.com/kunichiko/items/12cbccaadcbf41c72735

kamimikamimi

p12

p12はPublic-Key Cryptography Standards(略称PKCS)の12番目の仕様であり、パスワードに基づく鍵(暗号)により保護された秘密鍵と、それに関連する公開鍵証明書を保管するために一般に利用されるファイルフォーマットの定義のこと

鍵や証明書をひとつのファイルにまとめて取り扱うための形式
p12やpfx(Personal Information Exchange)と呼ばれたりする。

https://shinkufencer.hateblo.jp/entry/2019/07/12/000000

p12ファイルから取り出せるもの

鍵や証明書をひとつのファイルにまとめて取り扱うための形式」なので、いろんなものが含まれている

  • 公開鍵
  • 秘密鍵
  • クライアント証明書
  • 中間CA証明書

秘密鍵とクライアント証明書は取り出すのにパスワードを必要とするが、公開鍵はパスワードは不要。

中身の確認方法

方法は複数ある

  1. openssl コマンドを使う方法
  2. keytool コマンドを使う方法

1.openssl コマンドを使う方法

openssl とは

OpenSSL は、Secure Sockets Layer ( SSL v2/v3) および Transport Layer Security ( TLS v1) ネットワーク プロトコルと、それらに必要な関連暗号化標準を実装する暗号化ツールキットです。
opensslプログラムは、シェルからOpenSSL の暗号化ライブラリのさまざまな暗号化機能を使用するためのコマンド ライン ツールです。それは以下のために使用することができます

o 秘密鍵、公開鍵、およびパラメーターの作成と管理
o 公開鍵の暗号化操作
o X.509 証明書、CSR、および CRL の作成
o メッセージ ダイジェストの計算
o 暗号による暗号化と復号化
o SSL/TLS クライアントおよびサーバー テスト
o の処理S/MIME 署名または暗号化メール
o タイムスタンプ要求、生成および検証

https://linux.die.net/man/1/openssl

# 公開鍵も秘密鍵も含めて確認するコマンド
$ openssl pkcs12 -nodes -in test.p12
# パスワードを求められるので入力する
Enter Import Password:

# 結果
MAC verified OK
Bag Attributes
    friendlyName: Apple Development: Mika Urakawa (<teamIDらしきものが書かれている>)
    localKeyID: 0F B9 1B 1C 5C 4A DB B9 41 5A 61 A3 E3 0F 68 F0 2D 0A 1E D3
subject=/UID=ZZ8DHHBS78/CN=Apple Development: Mika Urakawa (<teamIDらしきものが書かれている>)/OU=95L82PNXV3/O=Mika Urakawa/C=US
issuer=/CN=Apple Worldwide Developer Relations Certification Authority/OU=G3/O=Apple Inc./C=US
-----BEGIN CERTIFICATE-----
<文字列がたくさん。これが証明書>
-----END CERTIFICATE-----
Bag Attributes
    friendlyName: Apple Development: Mika Urakawa (Mika Urakawa)
    localKeyID: 0F B9 1B 1C 5C 4A DB B9 41 5A 61 A3 E3 0F 68 F0 2D 0A 1E D3
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
<文字列がたくさん。これが秘密鍵>
-----END PRIVATE KEY-----
# 秘密鍵のみ抽出するコマンド
$ openssl pkcs12 -in test.p12 -nocerts -nodes
# パスワードを求められるので入力する
Enter Import Password:

# 結果
MAC verified OK
Bag Attributes
    friendlyName: Apple Development: Mika Urakawa (Mika Urakawa)
    localKeyID: 0F B9 1B 1C 5C 4A DB B9 41 5A 61 A3 E3 0F 68 F0 2D 0A 1E D3
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
<文字列がたくさん。これが秘密鍵>
-----END PRIVATE KEY-----
# 証明書のみ抽出するコマンド
$ openssl pkcs12 -in test.p12 -nokeys -nodes
# パスワードを求められるので入力する
Enter Import Password:

# 結果
MAC verified OK
Bag Attributes
    friendlyName: Apple Development: Mika Urakawa (D8S8S7FU3Y)
    localKeyID: 0F B9 1B 1C 5C 4A DB B9 41 5A 61 A3 E3 0F 68 F0 2D 0A 1E D3
subject=/UID=ZZ8DHHBS78/CN=Apple Development: Mika Urakawa (D8S8S7FU3Y)/OU=95L82PNXV3/O=Mika Urakawa/C=US
issuer=/CN=Apple Worldwide Developer Relations Certification Authority/OU=G3/O=Apple Inc./C=US
-----BEGIN CERTIFICATE-----
<文字列がたくさん。これが証明書>
-----END CERTIFICATE-----

オプションについて

  • -nodes:秘密鍵を暗号化しない
  • -nocerts:証明書を出力しない
  • -nokeys:秘密鍵を出力しない

https://www.ssl.com/ja/方法/opensslでpkcs12ファイルから証明書の秘密鍵をエクスポートする/

2. keytool コマンドを使う方法

keytool とは

keytool は、鍵と証明書を管理するためのユーティリティーです。keytool を使うと、自分の公開鍵と非公開鍵のペア、および関連する証明書を管理し、デジタル署名を使った自己認証 (ほかのユーザーまたはサービスに対して自分自身を認証すること) や、データの整合性と証明書に関するサービスを利用することができます。

  • JDK(Java Development Kit)に含まれているツールであり、単体でインストールは不可能

https://docs.oracle.com/javase/jp/12/tools/keytool.html

https://mpon.hatenablog.com/entry/2018/03/31/200000

iOS文脈でのp12ファイル

  • App Store 配布用の証明書
  • APNS用の証明書(プッシュ通知配信)

p12ファイルの作成方法

まずこの拡張子のファイルは、Apple Developer Program など Appleのサイトからダウンロードできるものではない。

作成手順

  1. 証明書の要求ファイルを作成(CSRの作成)
  2. Developer Center の Certificates で証明書を作成
  3. 証明書をダウンロードする(この時点ではcer 拡張子のファイル)
  4. cerを keychainに取り込む
  5. keychain で p12ファイルに書き出す

疑問1:なぜ cer のままではダメなのか?

https://faq.growthbeat.com/article/178-ios-p12