SSLとはなんなのか?

 SSLとは何ですか? そしてなぜ必要なのですか?

 と聞かれて、答えられる人は社会の中でもかなり少ないのではないかと思います。なんとなくhttpsとか単語は知ってるし、SSLが必要と言うビジネスマンも多いが、その仕組みを理解している人は少ない。

 SUNABACOプログラミングスクールでは、まずこのようなコンピュータ基礎についてもしっかり学習します。

 SSL(Secured Sockets Layer)は、Webセキュリティを強化するために90年代にNetscapeによって開発されたWebプロトコルです。 TLS(Transport Layer Security)は、SSLの改善として、インターネット技術特別調査委員会(IETF)によって開発されました。 一般に、SSLはSSLとTLSの両方を指します。

とはいえ難しいですよね。授業でもつまづく人が多い……

 SSLを使用すると、Webクライアントとサーバーで次のことが可能になります。

  • お互いの身元を確認できる。
  • 相互に送信するメッセージを暗号化できる。
  • それらの間で送信されるメッセージの整合性を確保できる。

 これらは、SSL証明書に関連付けられた暗号化キーを使用した対称暗号化と非対称暗号化の組み合わせによって機能しています。

対称暗号化と非対称暗号化とは?

 暗号化は一般に、対称型と非対称型の2つのタイプに分類できます。

一般的には公開鍵暗号化とも呼ばれますね!

 対称暗号化とは、メッセージを暗号化することよって、復号化する機能が自動的に付与されることを意味します。 これは、同じ秘密鍵を使用して暗号化と復号化を行うためです。

 公開鍵暗号化は、公開鍵と秘密鍵を使用する暗号化スキームです。

「鍵」という言葉が使われているせいで、鍵を使って復号する、というイメージがつきにくいと思います。

 公開鍵秘密鍵と呼ばれるものが存在します。公開鍵は暗号化に使用され、秘密鍵は復号化に使用されます。

公開鍵を使って暗号化し、秘密鍵でそれを解くってイメージ。そのため、秘密鍵は基本的には他の人に渡してはいけません。

 非対称暗号化(公開鍵暗号)を使用して、デジタル署名を生成することもできます。 署名の生成は秘密鍵を使用して行われ、署名の信頼性の検証は公開鍵を使用して行われます。SSLは、これらのデジタル署名を使用してWebサーバーのIDを認証します。

https://user3141592.medium.com/notes-on-computational-cryptography-98db5f2908f1

SSL証明書とはなにか?

 SSL証明書は、Webドメインでホストされているサーバーなど、特定のサブジェクトに関連付けられたデジタルドキュメントです。

  • SSL証明書の発行先
  • SSL証明書の有効期限
  • 暗号化に使用されるSSL証明書の公開鍵
  • 証明書を発行した認証局のデジタル署名

SSLプロトコルはSSL証明書を使用して

  • サーバーの信頼性の確認
  • クライアントとサーバー間で送信されるメッセージの暗号化
  • クライアントとサーバー間で送信されるメッセージの整合性の確認

SSL証明書はどこにあるのか?

 自己署名証明書を除き、SSL証明書は、認証局によって発行されます。

 認証局によって発行されていない自己署名証明書もあります。これらは通常、Webアプリケーション開発者による開発目的で使用されます。

 最大の認証局は、Symantec、GoDaddy、およびComodoがあります。これらの組織は全体のSSL証明書の75%以上を発行しました。他にも何百もの認証局があります。

自己署名SSL証明書とは?

 自己署名証明書は、認証局によって発行されていないため、認証には使用されません。ただし、暗号化には引き続き使用できます。これらの証明書はブラウザがトリガーとなって、ユーザーに警告を発します。 通常、テスト/開発用にSSL対応のWebサーバーをセットアップするための安価なソリューションとしてWeb開発チームによって使用されます。開発用ですね、本番環境ではあまり使われないかなと。

 認証局によって発行されたSSL証明書の中でも、3種類の証明書があり、それぞれにさまざまなレベルのセキュリティ(および価格の違い)があります。

  • 検証済ドメイン:すべての証明書の70%を占めています。これは、証明書に関連付けられたドメインが証明書を要求した人によって登録および所有されていることを確認するだけなので、セキュリティが最も低く、最も安価な証明書です。
  • 検証済組織:組織向けなのでドメイン検証よりも高価であり、セキュリティレベルも高くなっています。 証明書を要求する組織は、それが有効な会社であり、証明書が関連付けられているドメインを登録および所有していることを認証局に証明する必要があります。
  • 拡張検証:最も高価な証明書であり、最高レベルのセキュリティを備えています。そのため、認証局は会社に厳格な審査プロセスを要求します。たとえば、会社に関するすべての詳細は、認証局によって検証される必要があります。

SSL証明書が正当な認証局によって発行されたことをどうやって知るのか?

 ブラウザやスマートフォンなどのクライアントには、認証局とその公開鍵のリストが付属しています。ただし、認証局は数百あるため、クライアントはそれらすべてを保存することはできません。代わりに、クライアントはルート認証局を知る必要があります。

 ルート認証局は(もちろんそれらを検証した後)中間認証局に特別な証明書を発行でき、これらの中間認証局はSSL証明書を発行できます。

 たとえば、ブラウザがルート認証局によって署名されたSSL証明書を受信した場合、クライアントはその証明書を有効なものとして扱うことができます。ただし、クライアントが知らない中間認証局によって署名された証明書を受け取った場合、その証明書には、中間認証局に証明書を発行したルート認証局の署名が含まれます。クライアントはこのルート認証局を知っているため、直接発行されていなくても証明書を有効なものとして扱うことができます。

 

SSLプロトコルは実際にどのように機能するのか

 クライアントはサーバーに次の情報を送信します。

  • 実行しているSSLのバージョン。
  • どの暗号スイートをサポートするか。
  • サポートされている圧縮方法。

 サーバーは、サポートするSSLのバージョン、暗号スイート、および圧縮方法を選択します。サーバーは、IDを確認するためにSSL証明書を提供します。クライアントが自分自身を認証することを要求する場合もあります。
 次に、クライアントはサーバーの証明書の検証を試みます。クライアントのルート認証局のリストに対して証明書チェーンを参照して証明書を検証した後、クライアントはサーバーのIDと公開鍵を信用します。

 ランダムな秘密鍵がクライアントによって生成されます。次に、クライアントは、サーバーの公開鍵を使用した非対称暗号化によってこのランダムな秘密鍵を暗号化し、サーバーに送信します。サーバーには対応する秘密鍵があるため、クライアントのランダムな秘密鍵を復号化できます。
 これで、クライアントとサーバーの両方にこのランダムな秘密鍵が割り当てられます。 これでこのプロセスは終了し、2つのアプリケーションは、この秘密のランダムキーを使用してメッセージを対称的に暗号化することにより、安全に通信できます。

サーバーにSSL証明書をインストールする方法

 各認証局とWebサーバー(つまり、Apache、Nginx)でやり方は少し異なりますが、一般的な手順は同じです。
 まず、証明書を提供する必要のあるサーバーにOpenSSLライブラリ(SSLのオープンソース実装)をインストールします。 OpenSSLの一部のバージョンには、Heartbleed脆弱性と呼ばれる重大なセキュリティ上の欠陥があるようです。

 適切なバージョンのOpenSSLをインストールした後、それを使用して証明書署名要求(CSR)を作成します。このCSRは、証明書に関連付けられた秘密鍵となる.keyファイルと、認証局の証明書申請フォームにコピーされる.crsファイルを生成します。

 認証局が要求を承認し、証明書.crtファイルを返したら、それと秘密鍵.keyを、Webサーバーに応じて/etc/<web_server>/sslのようなディレクトリに配置します。微調整が必要なファイルもあります。たとえば、nginxでは、/etc/nginx/snippets/ssl-certs.confファイルと/etc/nginx/snippets/ssl-params.confファイルを作成する必要があります。これらのファイルは、使用するSSLバージョンと暗号スイートを指定します。

まとめ

 SSLの仕組みは、初心者にとって難しい部分だと思いますので、何度もいろいろな記事を読んだりして、理解していきましょう。

References

https://user3141592.medium.com/what-is-ssl-and-how-does-it-work-a5465d19b494

https://tkengo.github.io/blog/2015/12/01/https-details/

https://www.onamae.com/server/bepossible/ssl/?gclid=Cj0KCQjw9_mDBhCGARIsAN3PaFP4dmALEg6Gf79_ztld5A4fgvKY8NMleRGuuew-mgG8Nvsb3EPkoz0aArptEALw_wcB