大幅に修正しました(2019/12/18)
指摘をいただき、内容に誤りが多いことがわかったので修正しました!
こちらの記事を非常に参考にさせていただきました。
SSL/TLSの見落とされがちな「認証」という基本機能
SSHの公開鍵認証における良くある誤解の話
はじめに
SSLとSSHってなんか名前よく似てて、ごっちゃになってよくわからない!!
となったので自分用のメモとしてまとめる。
SSLとは
SSL(Secure Sockets Layer)とは暗号化の仕組みである。
トランスポート層のプロトコルであり、HTTPやFTPなどのプロトコルで行われる通信を暗号化して安全に送受信するためのプロトコルである。
また、TLS(Transport Layer Security)というSSLの次世代規格がすでに存在。
今はTLSが主流であるが、合わせてTLS/SSLと記載されることがある。
SSLの目的としては2つ
サーバーが安全かどうかの証明- 意図した接続先かどうか(なりすましでないか)の証明(認証)
- 通信内容の暗号化
例えばama●onなどで物を購入する際、名前や住所などの個人情報を入力し、送信する必要があります。
この時に注意しなくてはならないことが下の2点です。
- 個人情報を送信する先が意図した相手であること
- 本当にama●onのサイトか?見た目がそっくりなだけではないか?
- そもそもama●onは信頼できるサイトなのか?
- (送信先が意図した相手であるうえで、)送信途中で誰かに個人情報を盗み見られないか
個人情報を送信する先が意図した相手であること
いくら通信を暗号化したとしても送信先が意図する相手でなければなんの意味もありません。
送信先が意図した相手かどうかを確かめる時に利用されるのがサーバ証明書です。
サーバに接続を要求した時にサーバ証明書が送られ、この証明書を頼りにサーバー側が信頼できるサイトかどうかを判断する。
ただし、サーバ証明書が送られてきたとしてもその証明書が信頼できるとは限らない。
そこで「その証明書、信頼できるよ!」と保証してくれるのが認証局。
ただし、今度はその認証局が本当に信頼できるかわからない...といって堂々巡りになっていく。
この堂々巡りを一番大元まで辿るとルート証明書を持つ認証局までたどり着く。
このルート証明書はあらかじめブラウザに登録されているため、確実に信頼できるといえる。
最下層の証明書から、中間の証明書(中間CA証明書)をたどり、最上位の証明書(ルート証明書)までたどり着くことで、最下層の証明書が信頼できると判断できる。
信頼された証明書を持つサイトは[https~]から始まるURLとなり、ブラウザのURL欄に錠のマークがつけられる。
※ただしルート証明書が確認できたとしても、不正なサイトな場合もある。
そのため、接続する先のドメインをしっかりと確認することと、自分で信頼できるサイトであると判断する必要がある。
詳しくはSSL/TLSの見落とされがちな「認証」という基本機能を参照
送信途中で誰かに盗み見られることはないか
平文でそのまま送ってしまっては、送信途中で盗み見られてしまう可能性があるため暗号化を行います。
暗号化は共通鍵を用いて行いますが、共通鍵を共有する方法として以下の通り
- 鍵交換による共通鍵の共有
- DHEなどの鍵交換を用いた共通鍵の共有
- SSL/TLS(SSL3.0~TLS1.2)のハンドシェイクを復習する
- 公開鍵による認証による鍵交換の保護
- デジタル署名で認証を行ったうえで鍵交換を行う
- 【図解】初心者も分かる”公開鍵/秘密鍵”の仕組み~公開鍵暗号方式の身近で具体的な利用例やメリット〜
証明書に公開鍵を含め、共通鍵を公開鍵で暗号化して送り返す方法は、セキュリティの問題上近年使われなくなっている。
SSHとは
SSH(Secure Shell)は暗号化された遠隔ログインシステム。
SSHで接続する際に重要なことは以下の3つ
- クライアントからみてサーバーが意図した相手であること
- サーバーからみてクライアントが認証できること
- 送信途中で誰かに個人情報を盗み見られないか
クライアントからみてサーバーが意図した相手であること
SSLでは認証局が発行した証明書により、接続先が信頼できるかどうかを確かめることができた。
一方でSSHにおいては、接続先の証明書となるものが公開鍵である。
SSLでは証明書により保証されているが、SSHの場合の公開鍵が保証されていない。
(現在はSSHでも証明書による運用も可能)
そのためサーバーにSSHで接続すると、サーバーが公開鍵を受け取るが
この公開鍵を用いてディジタル署名を検証し、サーバーの検証を行う。
サーバーからみてクライアントが認証できること
SSLの場合はユーザー認証はオプション扱い(クライアント証明書を用いるもの)であったが
SSHの場合はユーザー認証が必須である。
認証方法(公開鍵認証)
- ユーザー側で秘密鍵と公開鍵のペアを作成
- 事前に接続先のサーバーに公開鍵を渡しておく
- ユーザー側で秘密鍵を利用して署名を作成し、サーバーへ送る
- サーバー側で公開鍵を用いて検証を行い、ユーザーの認証を行う
詳細に関してはこちらの記事がわかりやすくまとまってました。
SSHの公開鍵認証における良くある誤解の話
送信途中で誰かに盗み見られることはないか
暗号化に関してはSSLと大きな違いはないと考えられます。
最後に
色々と修正しましたが、誤りがある場合はまたご指摘お願いします。