iOS
公開鍵認証方式
証明書

iOSエンジニアが公開暗号鍵方式とApple証明書について調べた

AppleDeveloperサイトで証明書関係ってけっこう触るのですが、WEBアプリケーション開発には一度も触れたことがなく、この辺りの仕組みをほぼしらなかったので、調べてみました。

理解が浅いのでまだふわっとしていますが、随時修正していきます。

アプリ開発で必要になるCSRファイルとは?

CSRとは証明書署名要求という意味で、認証局に対しSSLサーバー証明書への署名を申請する内容です。CSRには「公開鍵」とその所有者情報、および申請者が対応する秘密鍵を持っていることを示すために申請者の署名が記載されています。認証局は証明書にその所有者情報を署名することで、所有者の存在を証明しています。SSL通信ではサーバーが公開鍵を提示し、これを用いて暗号化通信を開始します。SLLサーバー証明書は、「公開鍵」及び、そのついとなる「秘密鍵」の所有者情報が記述されたものです。

sick_memai.png

わからなさすぎて目眩がしたので、少しづつ調べました。

共有鍵方式とは?

  1. 送信者が、データを「共通鍵」で暗号化し、受信者へ送信する。
  2. 受信者側が受け取ったデータを、同じ「共通鍵」で復号化し、データを取得する。

公開暗号鍵方式とは?

  1. 送信者側が、受信者側が公開している「公開鍵」を取得する。そして取得した「公開鍵」で送信データを暗号化して送信する
  2. 受信者は、受け取ったデータを「秘密鍵」で復号化して、データを取得する。

SSL通信とは?

ステップ1:

  1. クライアントからサーバーへSSL通信の要求をする
  2. サーバーはSSL証明書と公開鍵をクライアントへ送信する
  3. クライアントは、公開鍵を用いて共通鍵を暗号化してサーバーにおくる
  4. サーバーは受け取った暗号データを秘密鍵を用いて復号化し、共通鍵を取得する

ステップ2:

  1. クライアントが、通信データを共通鍵で暗号化しサーバーへ送信する
  2. サーバーは、受け取った暗号データを「共通鍵」で復号化し、データを取得する。

SSLサーバー証明書とは?

SSL通信の仕組みだけではセキュリティが不十分であり、偽サイトに情報を抜かれる可能性がある。ここでSSLサーバー証明書の認証が役に立つ。

役割:
1. ウェブサイトの所有者の確認
2. 通信データの暗号化
3. 改ざんの検出

流れの図

index-fig-08.jpg
https://www.geotrust.co.jp/ssl_guideline/ssl_beginners/

署名(電子署名)とは?

証明書の内容をハッシュした値を、認証局の秘密鍵で暗号化したデータ。
公開暗号鍵方式では公開鍵で暗号化・秘密鍵で復号化していたが、電子署名の場合は秘密鍵で暗号化を行い公開鍵で復号化をする。

仕組みとしては
1. Aさんから秘密鍵で暗号化されたメッセージが届く
2. Aさんの公開鍵で復号化できた「今日飲みにいきましょう! by A」
3. 公開鍵で平文化できる暗号を作れた人はAさんのみ。→証明できた!

Apple証明書

結局CSRファイルってなに?

CSRはお客様のサーバ上で生成するもので、生成したCSRを認証機関に提出すると、認証機関がこれに署名をして、サーバ証明書を発行します。
https://comodo.jp/beginner/csr.html

CSRには「公開鍵」とその所有者情報、および申請者が対応する秘密鍵を持っていることを示すために申請者の署名が記載されています。

つまり、cerファイルを発行するための情報が電子署名されたファイル(であってるかな?)

cerファイル

CSRをApple Developer Centerにアップロードすると、証明書(.cer)が発行してもらえる。この証明書は署名付き公開鍵だと思えば。

https://qiita.com/edo_m18/items/6f10e57f95b25d9dab4e
この記事のコメント欄で、アップルは「公開鍵に対して署名を行なっている」とのコメントがあった。

「公開鍵」を受け取った人は、Appleの署名によりその鍵が確かに「秘密鍵の所有者」のものであることを検証できます。
そして、バイナリを「公開鍵」で検証することで、「秘密鍵の所有者」が送ったバイナリであることを検証できます。

p12ファイル

ユーザーの秘密鍵と電子署名が含まれたファイル
開発機を変更すると、キーチェーンに保存した秘密鍵なども利用できなくなるので、このp12にエクスポートして別のマシンで利用することがある。

秘密鍵は、パッケージ全体にコードサイニングを行うために必要
= なければ開発元が特定出来ない。

コードサイニング証明書は、ソフトウェアにデジタル署名を行う電子署名用の証明書です。ソフトウェアの配布元を認証し、なりすましや内容の改ざんなどがされていないことを保証し、ユーザの手元に責任をもってソフトウェアを届けることができます。
https://jp.globalsign.com/service/codesign/knowledge/

cerファイルと秘密鍵からエクスポートできる。

Provisioning Profile

証明書、端末とアプリ三者のマッチングを記載する許可証
Code Signに使われる

これがないと実機テストや、配信など出来ない。

参考

何故Xcodeでビルドエラー--iOS Code Signの徹底解説

iOSアプリのプロビジョニング周りを図にしてみる