SSL / TLS、理解の一歩

#SSL /TLSとは

##SSL（Secure Sockets Layer）とは
SSLとはインターネット上で通信するやりとりを暗号化して、第三者による盗み見や改ざんなどを防ぐための仕組み。
大切な情報（個人情報やクレジットカードなど）を守ることができます。
また、SSL化されているかは以下の内容を確認してみるとよいです。

・WebサイトのURLが**http**ではなく**https**から始まっている
・ブラウザのURLアドレス入力欄横に、**鍵マーク**が表示されている


##TLS（Transport Layer Security）とは

SSLに脆弱性が見つかり、バージョンアップを行っていく中で根本から設計を見直しできたのがTLSです。SSLは「SSL3.0」のバージョンアップで終わっており、その後はTLS1.0が登場しました。
ただ、SSLというワードが広く普及していたため、TLSを「SSL」や「SSL / TLS」と表記することが多いです(※当記事もここから以下文で「SSL」と表記させていただきます)。
厳密にSSL と TLSが同じというわけではありませんが、暗号化の手段という意味では同じと解釈していいと思います。

##なぜSSLが必要なのか（SSLの3つの役割）
###データの盗み見を防止する

オンラインショッピングのサイトなどでは個人情報やクレジットカード番号など重要な情報のやり取りを行うことが多く、それが第三者に盗み見られてしまうと非常に危険です。
他にはある企業の社外秘の情報も、第三者に見られると企業が損害を被ることがあり得ます。
SSLは大切な情報を守るための役割を果たしています。

###データの改ざんを防止する

こちらもオンラインショッピングを例にとると、商品の注文数を書き換えられてしまうなども起こりえます。
そうなると顧客側も店舗側も損害を被るので、余計な被害を出さないためにもSSLは必要になってきます。

###なりすましを防止する

みたびオンラインショッピングを例にとりますが、偽物の店舗や運営者を装い、個人情報やクレジットカードを不正入手されてしまう危険性があります。
SSLは、そのWebサイトの運営者（企業）が存在してそのドメイン（URL）の所有者であるかを証明するという意味合いもあります。
なりすましではない信頼のおけるサイト、というようなユーザーが安心して使用できる証明としても機能します。

##SSLの種類
###「独自SSL」と「共有SSL」

SSLの種類の説明の前に「独自SSL」と「共有SSL」について説明していきます。


|          |共有SSL              |独自SSL            |
|:---------|:------------------|:------------------|
|概要      |サーバー会社が所有するSSL証明書を複数ユーザーで共有して利用|自身の持っているドメインに対してSSL証明する            |
|メリット  |低コストですぐに使える|安全性の高さをアピールできる。またサイトURLを変更しなくてよい|
|デメリット|安全性のアピールに乏しい。またサイトURLが変わる|コストや審査の手間がかかる|



####独自SSL
自身の持っているドメイン（独自ドメイン）に対してSSL証明することを指す。

#####メリット
**Webサイトの安全性・信頼性の高さをアピールできる**
Webサイトの所有者自身が法人または個人名義でSSL証明書を発行することができて、※サイトシールも利用することができます。
（※サイトシール: SSL証明書を導入しているサイトだけが利用できる。サイトに掲載することでそのサイトの安全性を示す。）

**サイトのURLを変更しなくてよい**
独自ドメインに対してSSLサーバー証明書を発行してもらうことで、そのドメインに対してのみ暗号化通信が可能となる。
（例えば`http://example.com/` という独自ドメインを独自SSLにすると、`https://example.com/` となる）

#####デメリット
**コストがかかる**
認証の種類（レベル）などによって変わりますが、数千円・数万円・数十万円かかる場合があります。

**審査するなどの手間がかかる**
こちらも上記同様認証の種類（レベル）などによって変わりますが、認証局といった第三者機関への申請など必要になったりとすぐに導入できない場合があります。

####独自SSLの種類

独自SSLにはドメイン認証型・企業認証型・EV認証型があります（共有SSLにはありません）。

#####ドメイン認証型: DV（Domain Validation）
そのドメインの持ち主であるかどうかを証明します。
法人だけでなく個人でも取得出来て個人ブログなどに使われたりします。3種類の中で一番安価です（年間5千円とか、中には無料のものも）。
例えば [Let's Encrypt](https://www.kagoya.jp/ssl/freessl/) などで簡単な手続きをすれば導入できたりします。


#####企業認証型：OV（Organization Validation）
そのドメインの持ち主であり、同時にサイト運営元の企業・団体が実在することを証明します。
法人サイトで利用されることが多く、認証局での各種書類審査などが必要になりますが、その分信頼性・通信の安全性が高く支払い・決済するオンラインショッピングサイトや個人情報を取り扱うサイトなどで利用されます。

#####EV認証型：EV（Extended Validation）
3種類の中で最も厳格に認証するのがEV認証です。
企業認証の審査 + 企業の活動実態なども審査対象となります。
さらに、証明書の発行に時間がかかることもありますが、EV認証を導入したサイトには緑のアドレスバーによる表示で視覚的にアピールできます（ブラウザのバージョンによっては白色のままです）。
銀行のサイトや知名度の高いブランドサイト(トレンドマイクロetc)などで利用されます。


####共有SSL
サーバー会社が所有するSSL証明書を複数ユーザーで共有して利用することを指します。

#####メリット
**低コストで利用可能**
サーバー契約すると無料～数百円程度で導入できます。

**すぐに使える**
サーバー会社が取得したSSL証明書を使うため、自身でのSSLに関する手続きをして審査、、などの手間がかかりません。

#####デメリット
**Webサイトの安全性のアピールに乏しい**
先ほど述べたように、サーバー会社が代行取得したSSL証明書を複数ユーザーで共有して使うため、そのサイトへの情報確認・証明は行われません。
独自SSLに比べると安全性や信頼性に欠けてしまいます。

**ドメインが変わってしまう**
共有SSLはあくまでサーバー会社が取得した証明書なので独自ドメインでは使えません。（`http://example.com/` という独自ドメインを持っていても、共有SSLを利用するとhttps://〇〇〇-×××.jp/ などに変わってしまう。）


##SSL通信の流れと仕組み

###SSL通信で使われる２つの暗号方式

暗号化通信ではインターネット上でデータをやり取りする際、データの暗号化と復号化を行います。
**暗号化**・・・平文（テキストにそのまま書いた状態）を暗号データに変換する
**復号化**・・・暗号データを平文に戻す


その暗号化には「鍵」と呼ばれる暗号化方式が用いられます。
ここで出てくるのは
「公開鍵と秘密鍵」、「共通鍵」というものです。
**公開鍵と秘密鍵**・・・両者は一対で機能し、公開鍵で暗号化し対となる秘密鍵でのみ復号化ができる
**共通鍵**・・・暗号化と復号化に同じ鍵を使用する。つまり同じ共通鍵でないと復号化できない

###SSL通信の流れについて

####1. SSL証明書と公開鍵を送る
![SSL_TLS-SSL _ TLS1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237088/8016050b-ac78-3a42-b4d4-5fbe4096981a.png)
初めにブラウザからサーバーへHHTPSリクエストを送信します。
するとサーバーから※**SSL証明書**をブラウザに送ります。
SSL証明書には公開鍵が含まれています（公開鍵はサーバー側にある秘密鍵でのみ復号化できます）。


#####※SSL証明書
SSLによる暗号化通信を行うための電子証明書。SSL証明書は3(または4)階層の構造で、最上位層に**ルート証明書**という証明書があります。
認証局が発行するルート証明書はブラウザにも登録されており、サーバーから送信されるルート証明書と照合します。照合結果が一致すれば信頼できる証明書となります。

####2. SSL証明書の確認と共通鍵の生成
![SSL_TLS-SSL _ TLS2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237088/5433eef8-c396-f1eb-d3f7-ee58b4884ece.png)
ブラウザで受け取ったSSL証明書の最上位階層にあるルート証明書とブラウザに登録されているルート証明書を照合します。
照合に問題なければ安全なWebサイトであるとみなし共通鍵の生成を行います。

####3. 共通鍵を公開鍵で暗号化して送受信し、SSL通信を成立させる
![SSL_TLS-SSL _ TLS3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237088/80723cd9-2d08-25e6-7a46-03ea5685836e.png)

生成した共通鍵を公開鍵で暗号化してサーバーに送信します。
サーバー側は秘密鍵で複合します。これにより共通鍵を取り出します。
![SSL_TLS-SSL _ TLS4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237088/7cc6f920-b657-ab16-1101-0d7aa3620c25.png)

先ほどの説明では上り通信（ブラウザ→サーバー）ですが、反対の下り通信（サーバー→ブラウザ）も暗号化・復号によりSSL通信が確立されます。
（補足: このようなSSL通信の相互のやりとりを、SSLハンドシェイクと呼んだりします。[ハンドシェイクとは](https://e-words.jp/w/%E3%83%8F%E3%83%B3%E3%83%89%E3%82%B7%E3%82%A7%E3%82%A4%E3%82%AF.html) ）

#終わりに
今はSSL化が当たり前ですが、そのSSLにも種類があったりしてセキュリティも異なります。
こういうのがあるんだなと思ってもらえるだけでもうれしいです。