👺

無料の SSL 証明書が得られる ZeroSSL を使ってみた

2020/12/04に公開

はじめに

皆さんは ZeroSSL を知っていますか?個人でウェブサイトを運営している皆さんであれば、多くの方は Let's Encrypt を利用されていると思います。

https://letsencrypt.org/ja/

もちろん僕も使っています。僕の様なエンジニアの方であれば SSL の仕組みもおおよそ理解もしているし、コマンドラインの実行方法も知っておられるのでウェブサイトの SSL 証明書を取得する事もそれほど難しい事ではないでしょう。

しかしそれほど詳しくない方が certbot の様なコマンドを使って SSL 証明書を発行するのは割と難しい事です。そこでご紹介したいのが ZeroSSL です。

https://zerossl.com/

ZeroSSL とは

ZeroSSL もまだあまり名前が知られていないせいか、Google 検索で「ZeroSSL」を検索すると「ZeroSSLでブラウザだけで無料の証明書(Let’s Encrypt)を取得しよう!」や「Let's EncryptとZeroSSLで、もっと簡単にSSL証明書を用意する」といったブログがヒットする事もありますが、実際は Let's Encrypt と ZeroSSL は対立する立場にあります。

両者とも ACME(Automated Certificate Management Environment) という、Webサーバと認証局との間の相互作用を自動化するための通信プロトコルを実装した認証局 (certificate authority; CA)になります。

ZeroSSL と Let's Encrypt の比較

Let's Encrypt と ZeroSSL の比較は以下の対比を見ると分かりやすいでしょう。

ZeroSSL のウリは何と言ってもブラウザだけで SSL 証明書を発行できる所と言って良いでしょう。ログインアカウントを作り、「New Certificate」ボタンをクリックしてガイドに従っていくだけで簡単に証明書が発行されます。ダウンロードして crt ファイルと key ファイルを以下の様に設置すれば完成です。簡単ですね。

ssl_certificate /etc/zerossl/certificates/ドメイン名.crt;
ssl_certificate_key /etc/zerossl/certificates/ドメイン名.key;

この設定方法は Nginx の内容ですが、ZeroSSL で希望のフォーマットを選べば期待する証明書のフォーマットをダウンロードする事ができます。

追記

ZeroSSL は Let's Encrypt と違いアカウントを作らないといけない点が分からない、または良くない点と思われる方がいるかもしれません。ZeroSSL は無料の SSL 証明書だけでなく、期限の長い有料の SSL 証明書を発行する事もできます。また有償サポートを受ける事もできる様になっています。

この点が企業からの寄付で成り立っている Let's Encrypt と、営利団体として事業を行っている ZeroSSL の違いと言って良いでしょう。どちらが安定し存続し続けるのかは皆さんで判断下さい。

Let's Encrypt があるならいらなくね?

そう思ったりもしたのですが、先日とある記事を見付けました。

https://scotthelme.co.uk/introducing-another-free-ca-as-an-alternative-to-lets-encrypt/

研究者の Scott Helme 氏はこの記事の中で、これまで Let's Encrypt だけが無料 SSL を提供し続けてきた事で、単一障害点になりえると言っています。そしてこの記事の中で ZeroSSL が紹介されています。

Let's Encrypt が突然止まるといった事は考えにくいと思いますが、Scott Helme 氏が言う様に ZeroSSL の登場により生態系が変わり始めたのはとても良いことだと僕も思います。

まとめ

これまで皆さんも手間を掛けて certbot をインストールし、crontab に設定してきたと思いますが万人がこれを出来る訳ではありません。中には cron が動かせないサーバをお持ちの方もいると思います。そんなニーズに手が届くのが ZeroSSL となります。SSL 証明書の発行や設定に自信が無かった人、挫折した人は一度試してみると良いのではないでしょうか。

おまけ

さて ZeroSSL はブラウザだけで証明書が発行され、期限がせまればメールでお知らせしてくれるとても便利なサービスなのですが、一度発行した SSL 証明書の更新はできれば自動でやって欲しい物です。ZeroSSL もこの方法を提供しています。

https://github.com/zerossl/certbot-zerossl

ACME には EAB (External Account Binding) という外部のサービスに承認を委ねる仕組みがあります。

https://tools.ietf.org/html/rfc8555#section-7.3.4

certbot-zerossl はこの仕組を使い、Let's Encrypt 専用として使われてきた certbot の EAB 機能を介して ZeroSSL に承認させる為のラッパースクリプトになります。

ソースの中身を見るとおおよそ仕組みが理解できると思います。僕もこのスクリプトのお世話になろうと思ったのですが、非常に残念ながら大きな問題がありました。

僕は certbot が好きではない

僕は certbot が好きではありません。以前、certbot を導入し自分のサイトで運用していたのですが、ある日 OS のパッケージをアップデート(apt update) した後に certbot が動かなくなっているのに気付かず、しばらく SSL 証明が期限切れになっていた事がありました。

それ以来僕は certbot を使うのを辞めてしまいました。それに代わって使っているのが Lego です。

https://go-acme.github.io/lego/

Lego は Go 言語で書かれた Let's Encrypt クライアントです。シングルバイナリなので OS のアップデートで動かなくなる事はまずありません。僕は 2018 年に lego にスイッチしましたがそれ以降、一度も問題が起きた事はありません。

またフットプリントがめちゃめちゃ軽いのでメモリが少なめのサーバでも割と機嫌よく動作してくれます。

この lego にも certbot と同様に EAB 機能が付いています。certbot-zerossl が指定しているのと同じ物を lego に指定してやれば certbot を導入する事無く、cron で SSL 証明書を更新し続ける事ができます。

#!/bin/bash

ACCESS_KEY=ZeroSSLのAPIアクセスキー
JSON=$(curl -s -X POST "https://api.zerossl.com/acme/eab-credentials?access_key=$ACCESS_KEY")
EAB_KEY=$(echo "$JSON" | jq -r .eab_kid)
EAB_HMAC_KEY=$(echo "$JSON" | jq -r .eab_hmac_key)

/usr/local/bin/lego \
        --http.webroot /var/www/ドメイン名 \
        --path /etc/zerossl \
        --http \
    --eab --kid "$EAB_KEY" --hmac "$EAB_HMAC_KEY" \
    --server "https://acme.zerossl.com/v2/DV90" \
    --email "メールアドレス" \
    --domains "ドメイン名" \
    -a renew

/etc/zerossl の様な root 権限が必要なフォルダを指定する場合は sudoers を設定すると良いでしょう。以下のファイルを /etc/sudoers.d/lego-update といったファイル名で置いておくと良いでしょう。

mattn ALL=(ALL) NOPASSWD: /home/mattn/dev/lego/update.sh

ユーザ名やパスは更新して下さい。crontab に登録する場合はこんな感じ

4 0 * * 0 sudo /home/mattn/dev/lego/update.sh

もちろんシステムや root の cron で実行しても良いでしょう。

こんな感じに簡単なスクリプトで SSL 証明書が更新できます。http で認証しているので、既にウェブサーバが起動しておりポート 80 番で /var/www/ドメイン名 をサーブしている必要があります。ちなみに certbot と同じ様に SSL 証明書の発行も lego を使って実現できます。(renew を run にするだけ)

この様に、ZeroSSL を使う事で単一障害点とも言えた Let's Encrypt を使わなくても無料の SSL 証明書を発行、そして自動更新する事ができるのです。

皆さんも一度試してみられてはどうでしょうか。

追記

現在 ZeroSSL の証明書インストール確認ボタンが機能してないとの事。ほっておいて大丈夫らしく、後で開発者がちゃんと確認してくれるらしいです。

Discussion