証明書の設定(ACM)

証明書とは公開鍵が本当にそのウェブサイトの公開鍵かを証明するもので、HTTPSの通信等を行う際に必要となります。最近では、ブラウザによってはHTTPS通信できないウェブサイトを閲覧すると警告がでるようになってきてますので、SEO対策としても証明書の設定は必要となります。

ACM(Amazon Certificate Manager)とは、AWSのサービスとして証明書の発行をしてくれるサービスです。Route53で設定したドメインに対して、ACMで証明書を発行すれば、そのドメインでのHTTPS通信やSSL通信が可能になります。

公開鍵と秘密鍵

一昔前、暗号や署名などは共通鍵というひとつの鍵で行われていました。この共通鍵はあらかじめ特定の人たちで共有されているという前提です。

この前提が成立していればそれで良いのですが、そのためには共通鍵を盗聴・改竄されないように相手に教える必要があり、インターネット上だけでこの前提を作るのは至難の技で、郵送や電話などが必要になってしまいます。(それすらも疑ったら不可能になります)

そこで、RSA暗号という公開鍵・秘密鍵暗号が発明され、今日にいたって幅広く利用されています。これはつきつめると下記のフェルマーの小定理という整数論がベースとなっています。
$$
a^p \equiv a\mod p
$$
aは任意の整数で、pは素数となります。つまりどんなデータでもp乗すれば元にもどるというものです。話は飛躍しますが、これに基づき公開鍵・秘密鍵暗号は下記の特徴を持ちます。

  • 公開鍵で何か処理したものを、秘密鍵で処理すると元に戻る
  • 秘密鍵で何か処理したものを、公開鍵で処理すると元に戻る
  • 公開鍵だけ知っていても秘密鍵はわからない

という特徴を持ちます。一番下の特徴は「大きな整数の素因数分解は難しい」とよく言われているものです。

これを使うと、暗号や署名が事前に鍵を共有しなくてもできるようになります。


鍵を生成するときに、2つの鍵が同時に生成されます。ひとつを秘密鍵としてこれは自分だけの秘密にします。もうひとつを公開鍵としてみんなに教えます。インターネット上でばらまいても大丈夫です。

先ほどの特徴から、秘密鍵でデジタル署名したものを公開鍵で検証できます。また、公開鍵で暗号したものを秘密鍵で復号できます。いずれも秘密鍵はその人しか知らないものであるため、これが成り立ちます。

証明書の仕組み

あるウェブサイトとHTTPSで通信する際には、そのウェブサイトの公開鍵なるものを使って暗号化します。(正確には共有鍵を暗号化して送受信してそれで暗号化します)

ただ、この公開鍵が本当に正しいものなのか、だれか怪しい人が作った偽物のウェブサイトの公開鍵なのではないか等、疑問が生じます。そのため、その公開鍵がそのウェブサイトの正当な公開鍵であることを証明するための認証局(CA: Certificate Authority)があります。

こちらもドメインと同様に階層構造の分散管理となっており、下図のようになります。

あるウェブサイトの公開鍵は、中間CAの秘密鍵によって署名され証明書となります。中間CAの公開鍵は公開されているので、ユーザも検証できます。ですが、中間CAが偽物だったら?という疑問も生じますので、ルートCAという絶対的な認証局が中間CAの公開鍵に対して署名し、中間CAの証明書になっていますので大丈夫です。ルートCAの公開鍵は大丈夫なの?という疑問もありますが、こちらは工場出荷時のPCの中に入っていますので、偽物が入っていることは無いので大丈夫です。

ACMの設定

AWSにおける証明書の設定は、Route53でドメインの設定ができていれば簡単です。ACM (Amazon Certificate Manager)というサービスを開き、「証明書をリクエスト」を選びます。パブリック証明書を選択します。

証明書自体は料金はかかりません。(ドメインや証明書を利用するAWSリソースではかかります)

次にリクエストするドメインを入力します。例として、example.com というドメインを取得していたら、このドメインを入力してリクエストすると、example.comの証明書ができます。

ただ、これですと、www.example.com や test.example.com などのホスト名やサブドメインが付いたドメインに利用できないため、ワイルドカード(*)をつけて、 *.example.com でリクエストすると、上記をまとめて利用できる証明書ができます。

検証方法はDNSを選択すれば、Route53にドメイン所有者であることを証明するレコードを追加するだけで完了し、すぐに証明書が発行されます。少し待つかもしれませんが、その日のうちには発行いただけると思います。

ここでできた証明書は、HTTPS通信を受けるALBやAPI Gatewayなど、さまざまなところで利用できます。この証明書をセットするたけで、HTTPSやSSLの設定が済んでしまいますので、ACMで証明書を作成しておくことをお勧めします。