はじめに
サーバーサイドエンジニア目線でHTTPS通信の構築方法を解説するのですが、その前にユーザー目線でHTTPとHTTPS通信の違いを10分で分かるように解説していきます。
こんな人は絶対に読んでおきましょう。
- ホテルやカフェの公衆Wi-Fiを使用することが多い
- HTTPもHTTPSもWebのやりとりの種類の違いで、特に違いはないと思っている
- サーバー初心者でHTTPS通信の導入を検討している
HTTPとHTTPSの違い
すでにQiitaに投稿されている「httpとhttpsの違いが分かるエンジニアになりたい人に贈る、Amazon Certificate Manager(ACM)を使ったセキュアWebサイト構築」の解説内容と画像をお借りして、お話していきます。
HTTP通信の落とし穴
エンジニア目線ですが、ApacheやNginxのようなWebサーバーで普通にホームページを公開した場合は、HTTP通信になっています。
ユーザー目線では、よくURLを入力する際に http://... と入力しますよね。そのHTTPです。
では、ユーザーがHTTP通信をするとどのように情報がやりとりされるのか見ていきましょう。
以下の画像において、ユーザーが左の女の子、右がWebサーバーですね。
右下の猫が「モロバレじゃん」と言っていますが、どういう意味でしょうか?
HTTP通信では、通信内容を暗号化しないため、リクエストを送ったりレスポンスを送る内容を暗号化しない文字列(よく平文といいます)のままでやりとりをします。
では、これは何が危険でしょうか?
よくカフェやホテルの公衆Wi-Fiを使って作業する人がいるのではないでしょうか。
実は、この公衆Wi-Fiのように、同じネットワーク内にいれば、専用のソフトウェアを使うことで、通信の内容を簡単に見ることが出来ます。
特にこの通信内容の傍受用のソフトウェアが無料でも配布されており、誰でも使えるような代物なんです。
そのため、この女の子がWebサーバー側に問い合わせした内容を見ることが出来ますし、さらにWebサーバーから返ってきた内容も見ることができます。
まだ、この程度であればダメージが少ないかも知れませんが、HTTP通信の状態でログインやユーザーの新規登録を行うと、メールアドレスやパスワードを簡単に盗むことができます。
ITリテラシーのそこまで高くないユーザーであれば、メールアドレスとパスワードはどのウェブサイトも同じでしょうし、盗んだ情報で買い物もなんでも自由にできます。
結局、Amazonや楽天といったウェブサイトでセキュリティ対策がしっかりとされていても、その他のウェブサイトでメールアドレスやパスワードごと盗まれてしまえば、Amazonでも楽天でも楽勝で買い物ができてしまいます。
では、HTTP通信は絶対悪かというと、そういうわけではありません。
通常の閲覧のみのウェブサイトであれば、個人情報のやりとりも行いませんし、情報を盗まれることはありません。
エンジニア目線でいうと、個人情報を入力しないウェブサイトであれば、HTTP通信でも大丈夫ということになります。
HTTP通信のまとめ
- 通信内容が平文でやりとりされる
- 公衆ネットワーク内では簡単に通信内容を傍受できる
- 個人情報を入力する際はHTTP通信ではないことを確認すべき
HTTPS通信は「比較的」安全である
さきほどの例で、HTTPS通信であればどうなるかを見ていきましょう。
リクエストとレスポンスが読めないように暗号化されていることがおわかりでしょうか。
このように、HTTPS通信では、通信内容を全て暗号化します。
そのため、公衆のネットワークを利用する際も、通信内容を傍受は出来るのですが、内容を理解することが困難になるため、安心して利用することができます。
個人情報を入力する際には、絶対にそのページがHTTPS通信になっていることを確認しましょう。
HTTPS通信であるかの確認は、ブラウザのURL部分を見れば簡単に判別することができます。
私が展開しているサービスである「キカガク」で見てみましょう。
アクセスすると、上の画像のようにURLが https://... となっていることが分かると思います。
本当はもう少し詳しく話すと長くなるのですが、ざっくりというならば、このように https://... となっていれば安心して良いかと思います。
HTTPS通信の落とし穴
先ほどの章タイトルに「比較的」安全と書きました。
なぜ、絶対に安全ではないのでしょうか。
大きく分けて以下の2つの理由があります。
- そもそも接続先が安全でないウェブサイト
- 暗号化を行うためのSSL証明書の発行元が信頼できない(オレオレ証明書や証明書の有効期限ぎれ)
後者については、ブラウザ側で「安全でないウェブサイトに接続しようとしています」といった警告が出てくるため、その場合はアクセスしないといった方法で解決できます。
やっかいなのは前者ですね。
具体的な事例でいうとわかりやすいのですが、ある銀行のウェブサイトにそっくりのウェブサイトを作り、そこでHTTPS通信を出来るように設定しておきます。
HTTPS通信はドメインを取得し、いくらかお金を払えば簡単に設定できるため、もちろんそっくりな銀行のウェブサイトもHTTPS通信を実現することができます。
「HTTPS通信だから安全だ!」と思っているユーザーからすると、このそっくりな銀行のウェブサイトで何も考えずにログインをするでしょう。
そうすると、HTTPS通信をしているため、第三者から通信内容を傍受されることはありませんが、このそっくりな銀行のウェブサイトを作った人は、もちろんこの個人情報を入手することができます。
結局、HTTPS通信でも個人情報を盗むことが出来てしまいます。
じゃあ、HTTPS通信もだめじゃん!というとそうでもありません。
HTTPS通信を実現するためのSSL証明書発行の際に「企業認証」というものがあり、ちゃんと正式な銀行と通信しているよと証明することができます。
銀行などセキュリティ対策が非常に重要なところはもちろん、この企業認証済みのSSL証明書を使用して、HTTPS通信を実現しています。
ためしに、三菱東京UFJ銀行のウェブサイトにアクセスし、ログインのリンクにアクセスしてみます。
この画像のように、HTTPS通信の左側に、登録されている企業情報が表示されていることがわかります。
これで安心して、正式な銀行と証明されたウェブサイトでHTTPS通信ができるため、安心して個人情報を入力することができます。
すべてのサイトがこのように、企業認証まで行ったHTTPS通信を実現すれば良いのですが、企業認証のSSL証明書は非常に高価なため、この辺りはお財布と相談です。
SSL証明書の購入を検討されている方は、さくらインターネットのウェブサイトに用途別に書いてあるので、この辺りを参考にすれば良いかと思います。
HTTPS通信のまとめ
- 通信を暗号化するため、第三者から通信内容を傍受されても第三者は理解が困難
- 銀行などセキュリティ対策が非常に重要なウェブサイトではHTTPS通信だけでなく企業の実在性も要確認
まとめ
カフェやホテルの公衆ネットワークでよく作業される方は個人情報を入力する際には以下の2点を確認しておきましょう。
- HTTPS通信となっているか
- HTTPS通信の企業は信頼できるか
ウェブサイトのお問い合わせフォームなどは企業の実在性まで厳しく確認する必要はないと思いますが、メールアドレスやIDとパスワードのセットを入力する際は、この辺りをチェックしておくと安心できると思います。
参考文献
おまけ
フォローお待ちしています!
- Qiita: Carat 吉崎
- twitter:@carat_yoshizaki
- はてなブログ:Carat COOのブログ
- ホームページ:Carat
サービス紹介
「数学→プログラミング→Webアプリケーション」まで一気に学べる機械学習のマンツーマン家庭教師サービス「キカガク」に興味のある方はお気軽にご連絡ください。