🚀

HTTPS何それ、美味しいの?

2023/11/13に公開

はじめに

HTTPSとゆう言葉はよく耳にするのですが、実際どうやって動いているのかわかっていない部分が多いいので
学習しようと思います。

HTTPSとは?

HTTPSはHTTPとは違い通信が暗号化されているプロトコルのことで、
WEBサイトではHTTPではなくHTTPSでの通信が一般化しています。
(HTTPのサイトは見た記憶がないですね..)

どういった仕組みなのか?

HTTPSの暗号化を実現しているのは、SSL/TLSといった技術を使用して実現しているようです。

SSL/TLSとは?

共に通信を暗号化する技術のことで、TLSがSSLの仕様を元に作られた最新のようですが
世の中は今だTLSではなくSSLの言葉を使用しているので、SSLの言葉が残っているようです。
(SSLは現在使われていない)

そして、SSL/TLSは3つの仕組みがあるみたいです。

・通信の暗号化
通信の暗号化と複号化を行っている
・データ改ざん防止
データが改ざんされていないことを証明すること
・Webサイトの認証
利用しているWebサイトが本物であり、偽物ではないことを証明すること

通信の暗号化

通信の暗号化には、共通鍵と公開鍵の二つの暗号化方式を用いて実現している。
仕組みとしては以下の順番。

  1. ブラウザからWEBサイトにアクセスする。
  2. WEBサイトはブラウザに公開鍵付きサーバー証明書を送信する
  3. ブラウザは送られてきた証明書が正しいか調べ、正しかった場合共通鍵を作成。
  4. ブラウザはさらに作成した共通鍵を受信した公開鍵を使用して暗号化してWEBサイトへ送信
  5. WEBサイトは、ブラウザから送信した共通鍵(公開鍵で暗号化)を秘密鍵を使用して復号化する。
  6. WEBサイトとブラウザ双方で共通鍵がある状態になったので、以降の通信は共通鍵を使用して暗号化を行う。

データの改ざん防止

・デジタル署名について
デジタル署名とは、送信されたデータが改ざんされていないことを証明する技術のことだ。
具体的には以下の方法で実施される

  1. 送信者で公開鍵と秘密鍵を生成する。(デジタル署名では送信者側で生成)
  2. 送信者は、受信者に公開鍵を送付する。
  3. 受信者は、送信者で生成した公開鍵を入手する。
  4. 送信者が受信者に送付するデータを作成する。
  5. 作成したデータをもとにハッシュ関数を使用してハッシュ値を算出する。
  6. そのハッシュ値を秘密鍵を使用して暗号化する。
  7. ④で作成したデータと⑥で暗号化されたハッシュ値を"署名として"送信する。
  8. 受信者は、暗号化されたハッシュ値を、送信者から入手した公開鍵を使用して復号する。
  9. 受信者は、受信データをもとに、送信者側と同じハッシュ関数を使用して、ハッシュ値を算出する。
  10. ⑧で復号されたハッシュ値と、⑨で算出されたハッシュ値を比較して一致すれば、正しいデータと判断する。

Webサイトの認証

上記にSSL/TLSの役割にWebサイトの証明と記載しましたが、実現するにはデジタル署名の仕組みを利用しているみたいです。
仕組みとしては以下の通りでデジタル証明書を発行してブラウザとの通信に使用しているようです。

  1. Webサーバ側で公開鍵と秘密鍵を生成する。
  2. 公開鍵が正しいことを証明するために、公開鍵と各種証明書を認証局に送信して、デジタル証明書の発行を依頼する。
  3. 認証局は公開鍵や所有者情報と、これらをハッシュ値にした上で認証局に秘密鍵で暗号化したデジタル署名つきのデジタル証明書を発行する。デジタル証明書を受け取ったWebサーバは、デジタル証明書をインストールする。
  4. クライアントPCからWebサーバに対して接続要求を行う。
  5. 接続要求を行ったクライアントPCに対して、Webサーバはデジタル証明書をクライアントPCに送付する。
  6. クライアントPCは、受信したデジタル証明書(認証局の公開鍵を含んだデジタル証明書)が認証局から発行されたものかどうかを確認するために、認証局の公開鍵を使用して、秘密鍵で暗号化されたデジタル署名部分の復号を行う。そして、同じハッシュ結果なら正当な公開鍵を判断する。

まとめ

学習するまではHTTPSは通信を暗号化する技術程度にしか理解していなかったが、
暗号化の仕組みやデジタル証明・証明書のことまでしることができた。

理解したこと

HTTPSはSSL/TLSにより以下のセキュリティ対策を行っている。

データの盗聴を防ぐ
データの改ざんを防ぐ
なりすましを防ぐ

(少し賢くなったような気がする)

参考サイト

備考

Let’s Encryptってなんだ?
https://letsencrypt.org/ja/about/

Discussion