いつもいつも忘れてしまうので、備忘のため書いておくことにしました。本当に忘れっぽくて困る・・。
サーバー認証とは
サーバー認証とは、クライアントが、これから接続する相手であるサーバーの正当性を確認することです。
正確には、「サーバーの公開鍵」が正当なものかを確認することです。
サーバー認証の流れ
クライアントは、サーバーからサーバー証明書を受け取ります。
このサーバー証明書には、以下が記載されています。
- サーバーの公開鍵(これがメインの情報)
- その他属性
- 上記をまとめてハッシュ化し、更にそれを認証局の秘密鍵で暗号化したもの(= 認証局の署名)
- その時に利用されたハッシュ関数の名前、暗号化方式
クライアントは、サーバーの公開鍵が信頼できるものか確認するために、サーバーの公開鍵に認証局のお墨付きが付いているかを確認します。
具体的には、クライアントは以下を行います。
- 認証局の公開鍵と、4に書かれてある暗号化方式をもとに、3を復号します。(もともと認証局の秘密鍵で暗号化されているわけですから、認証局の公開鍵で復号できるわけです。)
- 4に書かれてあるハッシュ関数で、1と2をまとめてハッシュ化します。
- 両者が一致しているか確認します。
一致していれば、サーバーの公開鍵は認証局が署名した(信頼した)ものである、ということをクライアントは確認できます。
サーバーには、こういったサーバー証明書がインストールされていないと、クライアントからまともなサーバーだと信じてもらえず、TLS通信を開始することができません。
サーバー証明書とドメインの関係
サーバー証明書は、「サブドメイン名」と「ホスト名」を含むFQDNに対して発行されます。
例えば
- example.com
- sub1.example.com
- sub2.example.com
- userCompany1.example.com(マルチテナントサービス)
といった感じです。
また、このように個別で指定するのではなく、
- *.example.com
といったように、ワイルドカードを指定することもできます。この場合、「*.example.com」に対してサーバ証明書が発行されます。
ただ、ワイルドカード指定の証明書では、example.comの事業者の実在性は証明できるものの、
userCompany1.example.com
のuserCompany1の実在性までは証明できません。userCompany1の実在性を証明する必要があるならば、ワイルドカードで表現されたドメイン名の証明書ではなく、
userCompany1.example.com
のサーバー証明書を取得する必要があります。
こういった理由から、独自ドメインの独自SSL証明書(サーバー証明書)というものが必要となります。
具体例(Amazon CloudFront)
例えば、AWSのCloudFrontでは
*.cloudfront.net
のサーバー証明書はAWSが取得済みですので、CloudFrontが払い出してくれる
xxxx.cloudfront.net (xxxxはCloudFrontディストリビューションごとに異なる)
を呼び出し元に公開するのであれば、サーバ証明書についての手続きは不要です。
しかし、これではxxxxのコンテンツオーナーの実在性は証明されません。xxxxのコンテンツオーナーが自社の実在性を証明したければ、独自のドメインを取得し、このドメインのサーバ証明書を取得する必要があります。
例えば
userCompany1.com
のドメインを取得して、このドメインのサーバ証明書を取得するのです。
そして、このドメインをDNSで名前解決できるように、
userCompany1.com → xxxx.cloudfront.net
という紐付けを表現するCNAMEレコードを登録します。
(なお、xxxx.cloudfront.netとIPアドレスを紐づけるAレコードについては、当然ながらAWSが作成してくれます。)
参考
https://xtech.nikkei.com/it/article/COLUMN/20060725/244233/
https://www.digicert.co.jp/welcome/pdf/wp_ssl_domain.pdf