あすたぴのブログ

astap(あすたぴ)のブログ

https化の話しとLet’s Encrypt、ACMEプロトコルについて

近頃、https化が話題になっている。

https://japan.cnet.com/article/35100589/

chromehttpsではないサイトに警告を出すようになった。 それを受けて、このはてなブログなど個別に与えられるサブドメインがhttpであることが問題になったりしている。はてなはてなブログhttps化を進めていることを発表している。また現時点では同じようなサービスではMediumが独自ドメインhttpsが使用できる。他のサービスではBASEやSTORES JP(http://officialmag.stores.jp/entry/kaigyou/kinou-ssltaiou)が対応している。

https にすると何がいいのか

色んなところですでに話されていることで知っているだろうけども。 httpsssecueres でhttpをsecureにしたということ。 具体的にはインターネットを流れている情報を暗号化してやり取りをするようになる。 暗号化されていないと何が問題なのかというと、パスワードやクレジットカードの番号をそのまま送ることになる。 そのまま送るといってもその情報がどのように送られているかイメージが出来ないと思う。インターネットの通信というのは通信先のIPアドレスを特定し、そのIPアドレスに向かってルーターとかをいくつか経由して相手に通信先に届く。その経由するところに、パスワードやクレジットカードが渡るということになる。悪意を持ってデータを収集されていなければ何事もないかもしれないが、リスクがあるという話しになる。

また他には、httpsでなければ使用できない技術が増えてきている。例えば、httpといってもhttpにはいくつかバージョンがあり一般的には1.1というバージョンが使用されているが、2.0というバージョンも存在していてそれはhttpsでなければ使用ができない。 service workerというブラウザ上で動かせるプログラムもhttpsが必須になっている。

なぜhttpsにするのが大変なのか

暗号化されていて、安全ならみんなhttpsにすればいいんじゃないか?と思うよね。 昔はhttpsを使っているサイトだとしても重要な情報をサブミットするとき、ログイン時などだけhttpsを使用する。という運用が行われていた。それは何故かというと暗号化には復号化という処理が伴うのだが、この2つの処理をするにあたりパソコンのCPUを使用する。この処理はそこそこ時間がかかるもので全通信をhttpsにするとサイト全体が重いということになり、ユーザーの体験が損なわれる。それで重要な情報をやり取りしないページではhttpにしサイトを軽くしていた。 技術は進化し、パソコンのCPUは強くなり、暗号化に使用しているアルゴリズム(暗号の種類)もより計算量が少ないものになったりした。それによって暗号化、復号化にかかる時間は減り、すべてのページを安全にしたほうがいいんじゃない。という成行き。だと思う。

とはいえ、httpにsを付けるにはどうすればいいのか。 それを行うためには、SSL証明書というものが必要になる。(現在使用されているのはTLSだが、SSLと呼ぶことにする) SSL証明書というのは暗号化を行うために必要であるものと共に、そのサイトの正当性を証明するものでもある。 SSL証明書を発行するためには、https://jp.globalsign.com/ こういうところで購入することになる。SSL証明書にも種類があり、一番安いDV証明書でもここを見る限りは年34800円かかる。気軽に自分のサイトを作って公開できたりしていたインターネットはどうなっちゃうだよ。って思う値段だ。また証明書を発行するのに暗号化に使用する鍵を作成したりする。(むずかしい) とてもじゃないが、趣味レベルの個人サイトで行うのは無理だ。

https化してくれるサービスはそれだけお金払ってるの?

ここでタイトルにあるLet's Encryptというのが出て来る。無料で証明書を発行してくれる認証局になる。 ただ、DV証明書しか発行できなかったり、証明書の期限が90日だったりと制限はあったりする。とはいえ、34800円がタダになるのはすごい。BASEなどのサービスはユーザーの代わりにLet's Encryptに申請して証明書を取得している。ことになる。

ACMEプロトコル

とはいっても従来の認証局のような手続きを1ユーザー、1ユーザーに対して行うのは骨が折れる。それを解決する為に策定が進められているのがACMEプロトコル、Automatic Certificate Management Environmentの略で証明書の自動発行、管理の方法を取り決めている。 Let's Encryptはこれに従いつつ自動で証明書を発行できるサーバーになる。そのサーバーはOSSで開発されている( https://github.com/letsencrypt/boulder ) RFCgithubで議論されてたりする。 ( https://github.com/ietf-wg-acme/acme )

雑にACMEプロトコルを説明すると以下になる

  • ユーザー登録
  • 申請
  • チャレンジ
  • 証明書取得

ユーザー登録し、このドメインの証明書をくれー。ってお願いして、チャレンジと呼ばれるドメインを所持していることを証明する作業を行い。証明書発行側でそれを確認できたら証明書を発行できるようになる。 これをプログラムで自動に行うことでユーザーが使用する証明書を取得する。

ACMEプロトコルの詳細は気が向いたら書く。