自主的20%るぅる

各々が自主的に好き勝手書くゆるふわ会社ブログ

Let’s Encryptでワイルドカード証明書を運用するときのメモ

久々に小ネタでも投稿してみようと思ふ

ここ最近、社内の様子は頻繁にご紹介しておりましたが、「そういえば技術ネタってしばらく投稿していなかったな」とふと思いまして……。

お昼休みの時間を使って、ここ最近個人的にハマった小ネタをテーマに書いてみようかと思います。

誰でもいつでも自由にSSLサーバ証明書がゲットできる!Let’s Encrypt!

さて、Let’s Encryptというサイト/サービスはご存じでしょうか?

Let’s Encrypt – Free SSL/TLS Certificates

Let’s Encrypt is a free, automated, and open certificate authority brought to you by the non-profit Internet Security Research Group (ISRG).

過去には有料でしか手に入らなかったSSLサーバ証明書を、無料でお手軽に誰でも自由に手に入るようゴニョゴニョしてくださっている非営利団体ですね1)ドメイン認証なSSLサーバ証明書だけですが

2016年4月にサービスがスタートしてから、大手企業や団体などのスポンサードを受けつつ、多くの人たちを救ってきた(?)このサービス!非公式ではあるものの日本語のサポートサイトなどもあるので、多くの方がご利用中のことと思います。

つい最近、ワイルドカード証明書に対応したのもあり、どんどん便利になってきましたね〜。

導入も簡単!

Let’s Encryptからサーバ証明書を取得するのも非常に簡単!

  • certbot-autoをダウンロード2)OSによってはパッケージが用意されていることもあるよ!
  • Webサーバを適切に設定3)この時点ではhttp onlyでOKし、certbot-autoを適切なオプションで実行
  • 画面の指示に従ってゴニョゴニョ
  • 無事取得できたらWebサーバに設定し再起動などをおこなう
  • cronとかで自動的に更新されるよう設定4)90日間の有効期限しかないので

……って感じでやればOKと、非常にお手軽ですよね〜。

あ、もうちょっと細かい手順が知りたい方は、下記をご参照ください。

Getting Started – Let’s Encrypt – Free SSL/TLS Certificates

To enable HTTPS on your website, you need to get a certificate (a type of file) from a Certificate Authority (CA). Let’s Encrypt is a CA. In order to get a certificate for your website’s domain from Let’s Encrypt, you have to demonstrate control over the domain.

Let’s Encrypt の使い方 – Let’s Encrypt 総合ポータル

当サイトは、無料 SSL/TLS 証明書発行サービス Let’s Encrypt の非公式解説サイトです。 This is an unofficial website about Let’s Encrypt.

ワイルドカード証明書もお手軽にゲットできる!

先に述べた通り、ワイルドカード証明書——ホスト/サブドメイン部分がなんであってもOKなサーバ証明書にも対応したので、同一サーバ内で複数サブドメインを運用するときなんか、だいぶ楽になりましたよね。

導入方法は(少なくとも現時点では and/or ボクが知る限りにおいては)ちょっと特殊な操作が必要ですが、コマンドひとつタイプするだけでOKです。

ボクは下記のQiitaなエントリを参考にさせていただきました。

Let’s Encrypt (certbot) でワイルドカード証明書できた! – Qiita

先日、 という記事を書きまして、Qiitaでの初投稿であったにも関わらず5000以上のアクセス、100いいねを頂きました。 投稿時点ではちゃんとワイルドカード証明書が発行できたと思っていたのですが、実際はまだステージングの段階で無効な証明書しか発行されないというツッコミを頂きまして、ドキュメントの読み込み不足・検証不足を痛感し記事に追記したところであります。 ところがやっと、 「ACME v2エンドポイントがProductionEnvironmentとして利用可能になった」というアナウンスがあり、 対応クライアント一覧にcertbotが入っていたので、もう一度検証してみることにしました。 警告が出ない、ちゃんとしたワイルドカード証明書が発行される←NEW yumで入るcertbotはまだ古い(2018/03/14 04:30 JSTごろ) ACME v2 のエンドポイントは明示的な指定が必要 epelが必要だった気がする 普通にDNS認証でやってみる→失敗 嫌な予感がする バージョンが古かった Release 0.22.0 ってコミットメッセージが入ってます。しかも6日前。 クローンする 前回の記事のコマンドから不要な部分を削って実行してみます APIサーバのエンドポイントのデフォルトは古いままのようです。 ACMEv2本番用である https://acme-v02.api.letsencrypt.org/directory をエンドポイントに指定して再度実行します。 ちゃんとTXTレコードが表示されました。 これをDNSサーバに登録して、何かキーを押すと、証明書が発行されます。 nginxで適当にWEBサーバを建てて、証明書の検証をしてみました。 特に警告が出ることもなく、緑色の鍵が表示されています。 発行者の名称の部分も、ステージングAPIでは Fake LE Intermediate X1 となっていましたが、ちゃんと正規の Let’s Encrypt Authority X3 となっています。 ねむいです。著書買ってくださると励みになります。 イラスト図解でよくわかる ITインフラの基礎知識

一応、コマンドを載せておきますと……

certbot-auto certonly --manual -d *.example.com -m mailaddr@example.com --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory

……って感じです。

これだけで「*.example.com」なサーバ証明書がゲットできるので、「www.example.com」でも「service.example.com」でも「ramentabetai.example.com」でもなんでもHTTPSで立ち上げられるようになるわけです。

地味な落とし穴が……

で、喜んでいたんですけど、ひとつ重大な問題が……。

それは「example.com」——ホスト/サブドメインが指定されていない「ドメイン名 Only」な場合には使えない証明書となっているということ。

実際に設定してみて、「https://example.com/」にアクセスしてみると……下記のようになってしまいます。

MacなChromeの場合

MacなFirefoxの場合

MacなSafariの場合

……え?ああ、そうなんだ……へぇ…… _ノ乙(、ン、)_

普通のサイト5)ところで、普通ってなんなんでしょうねぇ……(遠い目)だったら、例えば「www.example.com」のようなHTTPSなサイトにリダイレクトかけちゃえば問題ないんでしょうけど、HSTS (HTTP Strict Transport Security) の設定とかしてるとリダイレクト前にエラーになっちゃったりするので……6)ボクが設定ミスっていたり勘違いしている可能性もあるけど

ちょっとマズイですよね。うん。

解決策は単純

まあ、これは深刻な問題では全くないんで、シンプルに解決することができます。

「*.example.com」で指定して発行されたサーバ証明書が「example.com」には対応していない……って話なので、「example.com」に対応するように指定してあげればOK。

具体的なコマンドで言えば、下記のような感じでしょうか。

certbot-auto certonly --manual -d example.com -d *.example.com -m mailaddr@example.com --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory

元々、certbot-autoは「-d」オプションで複数のドメインを指定できたので……。その要領で追加してあげればいい……って感じっぽいです。

将来の自分のためにメモを残しておきます

……と、きっと将来の自分がおんなじところでミスる気がしてならないので、自分用のメモって意味も込めてブログに書き記しておきます。

あ、「もっと良い方法あるよ〜」とか「そこ間違ってるよ〜」とかあれば、ぜひぜひツッコんでくださいm(_ _)m

注訳はこちら

注訳はこちら
1 ドメイン認証なSSLサーバ証明書だけですが
2 OSによってはパッケージが用意されていることもあるよ!
3 この時点ではhttp onlyでOK
4 90日間の有効期限しかないので
5 ところで、普通ってなんなんでしょうねぇ……(遠い目)
6 ボクが設定ミスっていたり勘違いしている可能性もあるけど
Let’s share this article!

{ 関連記事 }

{ この記事を書いた人 }

アバター画像
Yuta Hayakawa

2016年6月入社。2020年12月より取締役に就任しました。

普段は東京本社で管理職のお仕事したり、広報的役割としてテキスト書いたり動画作ったりするのが最近のお仕事。

自称「社内システムチーム統括」として、社内システムチームの面々を見守りつつ毎日を過ごしています。

プライベート面では、音楽やコンピュータ関連、ゴルハム&ジャンハム関係、ゲーム関係が興味あるポイント。

あと、我が子可愛い。

記事一覧