公開鍵と証明書による安全な通信とは？

この記事は、[『CrowdWorks Advent Calendar 2018』](https://qiita.com/advent-calendar/2018/crowdworks)の16日目の記事です。

12月に入社しましたSREチームの久村です。
認証周りの開発をしていくのに暗号周りの知識が浅いので、第一歩として通信の安全化にはどんな技術が使用されているのかをイラストを使って自分なりにまとめました。

##そもそも安全な通信とは？
- 送る情報を暗号化し、他の人に情報が盗聴されても読めないこと。
- 送信者が想定している送信者であると断定できること。

送られている情報が見られても、その内容が読めない文字列で書かれていたら悪用することは難しくなります。
また、送信者を断定することができれば「10万円振り込んでください。Aより」とAさんを装ってBさんが送信していても騙されることはありません。

このような通信の秘匿性、真正性のためには**公開鍵暗号方式**と**電子証明書**という技術が使用されています。

まずは公開鍵暗号方式の説明からしていきますね。

## 公開鍵暗号方式

公開鍵暗号方式の説明の前に **共通鍵** の説明をさせてください。（公開鍵の理解を助けるはず。）
### 共通鍵での通信
**鍵**とは暗号化したり、復号（暗号化されたのを元に戻す）するときに使うデータのことです。
この鍵を使って、文書を暗号化したり、復号する流れを説明していきますね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149318/17bb658b-bb7c-76d1-5d60-5c867dd37053.png)


共通鍵では送信側と受信側で同じ鍵を使用します。
暗号化するときと、復号する時で同じ鍵を使うということですね。

太郎くん（送信者）は手元の鍵で文書を暗号化し、花子ちゃん（受信者）に送信します。
花子ちゃんも手元の鍵で文書を復号することで内容を確認することができます。

**★共通鍵とは1つの鍵で暗号化し、同じ鍵で復号する仕組みです。** 

ここで難しいのは鍵をどのように渡すかという問題です。（ **鍵配送問題** ）
物理的に渡すのでは、海外の人との交換などは非常に手間がかかりますし、
100人と鍵を交換するとなると、その管理も爆発的に増えてしまって嬉しくないですね。。

もし鍵が漏れてしまうと以下のようになってしまいます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149318/b69d2b36-b1ac-8a5f-bfcd-0d04a82ef348.png)


盗聴者が同じ鍵を持っているので、文書を復号できてしまい、内容を読むことができてしまいます。

この鍵配送問題を解決する手段として **公開鍵暗号方式** の仕組みがあります。

### 公開鍵暗号方式での通信
先ほどは１種類の鍵を使用して通信していました。
公開鍵暗号方式では２種類の鍵（**公開鍵**、**秘密鍵**）を使用して通信を行います。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/149318/73da28f4-e702-9f8e-95f7-f7f45fe2116f.png)



花子ちゃんは公開鍵と秘密鍵を作成し、名前のとおり公開鍵を公開します。
秘密鍵は他の人には知られないように自分で管理します。
太郎くんは花子ちゃんの公開鍵を使って文書を暗号化し、花子ちゃんに送信します。
花子ちゃんは自分の秘密鍵を使って、文書を復号することで、内容を確認します。
盗聴者は花子ちゃんの秘密鍵を持っていないので、文書を復号することができません。もちろん、公開鍵を使って復号することもできません。

**★公開鍵暗号方式とは公開鍵で暗号化し、秘密鍵で復号するという仕組みです。** 

おお〜これにて一件落着！
っといきたいところですが、この公開鍵が花子ちゃんのでなかったら。。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149318/53f6fd1b-3022-dfe5-9128-fa89dcbf7160.png)


花子ちゃんの公開鍵だと思っていたものが、実は盗聴者の公開鍵だったという状態です。
太郎くんは花子ちゃんの公開鍵だと思って暗号化したつもりが、実はこの公開鍵は盗聴者のものでした。
盗聴者の公開鍵で文書を暗号化したので、盗聴者は自分の秘密鍵を使って文書を復号することができてしまいます。

残念。。
これでは安心して通信することができませんね。。
ではどうすれば良いのでしょうか？

使いたい公開鍵が花子ちゃんのだと断定することができれば安心ですよね。
その仕組みが **電子証明書** です。

## 電子証明書
電子証明書で必要になる、**電子署名**の説明を先にさせてください。

### 電子署名
この技術は
 **★このメッセージを書いたのは誰かを特定するためのものです。** 

実物の証明書や契約書の場合、その文書が本当にその人によって作成されたものであるかは、その文書に付されたその作成者の署名や印によって証明されますね。

同様に、電子署名はデジタルデータに送信者を証明できる印を付与するものです。これにより相手の確認、なりすましの防止、改ざんの防止が行われ、インターネットを安心して利用することができるようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149318/3c20d47e-a3c6-ea27-3f43-73a5be469dad.png)





電子署名は送信者の太郎くんが行うものです。
太郎くんは自分の秘密鍵を使って、電子署名を作成し、文書に付与します。
電子署名の作成は「私はこのメッセージの内容を認めます」という印です。
電子署名を検証するのは、受信者の花子ちゃんが行います。
花子ちゃんは太郎くんの公開鍵を使って、電子署名の検査を行います。
検査とは「このメッセージのデジタル署名は確かに太郎くんのものかどうか」を調べる行為です。

何だか、どこかで見た流れに似ていますね。
そうです。
 **電子署名は、公開鍵暗号方式の流れを「逆に使う」ことで実現できる技術です。** 
秘密鍵を使って電子署名を作成し、公開鍵を使って電子署名を検査するんですね。

### 電子証明書の仕組み
では電子証明書の説明に入りたいと思います。

電子証明書とは**認証局が公開鍵の作成者を確認し、公開鍵に電子署名をして作成されるもの**です。
**認証局**とは、電子証明書を発行する機関であり、ここで電子証明書の管理を行なっています。

認証局はなかなかイメージしにくいですが、**「この公開鍵は確かにこの人のものである」**と認め、電子署名を作成し、電子証明書を発行できる人や組織のことですね。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/149318/790733b6-3802-f1fa-3f3d-d56028dfce6f.png)



花子ちゃんは公開鍵に電子署名をしてもらうため、認証局に自分（花子ちゃん）の公開鍵を渡します。
認証局は自分（認証局）の秘密鍵を使用して、花子ちゃんの公開鍵に電子署名をして、電子証明書を作成します。
太郎くんは認証局から電子証明書を取得します。
そして、認証局の公開鍵を使って、電子証明書に含まれている電子署名を検証します。
検証の結果、間違いなく認証局の電子署名だと確認でき、電子証明書に付いている公開鍵が花子ちゃんのものであることが確認できました。

**★電子証明書とは公開鍵への電子署名の仕組みです。** 


ふ〜色々な技術が出てきましたね。
最後に電子証明書を使用した流れを整理します。（ちょっと複雑になりましたので番号をふって説明します。）


![image.png](https://qiita-image-store.s3.amazonaws.com/0/149318/55ff0abe-662a-39e7-210e-6fd01ee912eb.png)




①花子ちゃんは公開鍵と秘密鍵を作成し、認証局に公開鍵を登録します。
花子ちゃんは自分の公開鍵を認証局に送ります。

②認証局は花子ちゃんの公開鍵に電子署名をして、電子証明書を作成します。
認証局は自身の秘密鍵を使って、花子ちゃんの公開鍵に電子署名をして電子証明書を作成します。

③太郎くんは認証局から電子証明書を入手します。
太郎くんは花子ちゃんに暗号文を送りたいと思い、認証局から電子証明書を入手します。
電子証明書には、花子ちゃんの公開鍵が含まれ、公開鍵には認証局の電子署名が付いています。

④太郎くんは、認証局の公開鍵を使って電子署名が正しいことを検証し、公開鍵が花子ちゃんのであることを確認します。
太郎くんは、認証局の公開鍵を使って、電子証明書に含まれている電子署名を検証します。
この検証に成功すれば、公開鍵は確かに花子ちゃんのものであると確認でき、花子ちゃんの公開鍵を入手したとこになります。

⑤太郎くんは花子ちゃんの公開鍵で文書を暗号化し、花子ちゃんに送信します。
正しいと確認済みの公開鍵を使用ですね。

⑥花子ちゃんは、暗号文を自分の秘密鍵で復号し、太郎くんの文書を読みます。
太郎くんが花子ちゃんの公開鍵を使用して文書を暗号化したので、花子ちゃんは自分の秘密鍵で復号することができました。
盗聴者は自分の秘密鍵を使用して復号を試みますが、花子ちゃんの公開鍵で暗号化されているため文書を復号することはできません。

めでたく安全な通信が完了しましたね！

## まとめ
イラストを多用して、公開鍵暗号方式と電子証明書を使った通信の流れを整理したことで、安全な通信の理解を深められました。（でもまだまだですね）
ここでは解説できていない暗号化のアルゴリズムや電子署名の作り方、電子証明書の種類など非常に多くの技術が存在しています。
今回の記事が今後の暗号技術を調査される際の手助けになれば嬉しいです！