1
さくらのクラウドDNS経由でワイルドカード証明書を
後からインストールしたCERTBOTで取得する方法
株式会社シーポイントラボ 高橋 良季
自己紹介
• 高橋 良季 (たかはし よしき)
• 株式会社シーポイントラボ 所属
• 静岡県浜松市のシステム開発会社
(主にWebアプリとスマホアプリを開発)
• Webエンジニア
• Linuxまわり
• PHP
• Javascript
• etc…
• どちらかというとバックエンドが好き
2
目次
§1 SSL証明書高すぎ問題と Let’s Encrypt
§2 さくらのクラウドDNSを使って
ワイルドカード証明書を”後から”取得する方法
§3 苦労した点・所感
3
以前弊社のブログに掲載した内容をもとにご説明します。
※ 記事公開当時の情報を含みます。
§1 SSL証明書高すぎ問題と
Let’s Encrypt
4
かつて、SSL証明書は高嶺の花だった…
(特に学生時代の僕にとっては)
• 大学生時代に、勉強も兼ねて自宅サーバーを作って
公開していた。
• Webサーバーやネットワークの設定方法など、非常に
勉強になった。
ここまではよかった…
5
やっぱりSSLが欲しくなる。
• サイトへのコメント投稿や自宅サーバーへの
ダッシュボードのログインなど、SSL化しておかないと
不安な部分が出てきた
• 当時、すでにChromeを始めとしてSSL化への流れが
あった。(徐々にSSLの扱いが厳しくなり始めていた)
6
よし、SSLを取ろう…!!!
• 安くても年額2万以上する
• 最初はお試してやりたかったのに、年額2万はキツイ…
• サブドメインごとに取得しないといけない
趣味でやるには敷居が高すぎた。
7
とりあえず”自己証明書(オレオレ証明書)”で我慢
• とにかくSSL通信は行いたかったので、自己認証局で
SSL証明書を発行
• OSに証明書を信頼させることで、自分の環境ではSSL
にすることができた
• 外からサイトを見に来てくれる人には正式なSSLとして
認識されない
• スマホへのSSL証明書登録が面倒だった
(証明書の形式を変換する作業など)
8
しかし…
貧乏学生の救世主、StartSSL
(※ 個人の目線)
• イスラエルの企業が運営していたSSL認証局
• 無料でSSL証明書を取得できるサービスを提供していた
※ ワイルドカード証明書は有料
※ 間違えて証明書を取得した場合は、失効手続き(有料)
が必要
9
貧乏学生の救世主、StartSSL
(※ 個人の目線)
使い勝手こそあまり良くはなかったものの、無料で
SSL証明書を取得できる唯一と言ってもいいサービスだった。
10
2015年 Let’s Encrypt のベータ版がサービスイン!
• 自分の所有しているドメインなら複数のSSL証明書が無
料で取得できる
• ただし有効期限は約3ヶ月(取得から90日間)
• 自動でLet’s EncryptのSSL証明書を更新、デプロイしてく
れる”letsencrypt-auto”ツール(後のcertbot-auto)が用意
されていた
• GoogleやCisco、Mozillaなど、信頼できる企業が運営の
バックに ついている
11
StartSSL と Let’s Encrypt の比較
料金 有効期限 ワイルドカード
自動更新
ツールの提供
StartSSL
無料
※ただし再取得
目的を含む失効
処理は有料
1年 非対応 なし
Let’s
Encrypt
再取得含めて
無料
※ただし取得要
求APIのレート
リミットあり
90日 非対応 あり
12
2018年1月、Let’s Encrypt がついに
ワイルドカード証明書発行に対応!!!
13
StartSSL と Let’s Encrypt の比較
料金 有効期限 ワイルドカード
自動更新
ツールの提供
StartSSL
無料
※ただし再取得
目的を含む失効
処理は有料
1年 非対応 なし
Let’s
Encrypt
再取得含めて
無料
※ただし取得要
求APIのレート
リミットあり
90日
非対応
対応!!!
あり
14
StartSSL と Let’s Encrypt の比較
料金 有効期限 ワイルドカード
自動更新
ツールの提供
StartSSL
無料
※ただし再取得
目的を含む失効
処理は有料
1年 非対応 なし
Let’s
Encrypt
再取得含めて
無料
※ただし取得要
求APIのレート
リミットあり
90日
非対応
対応!!!
あり
15
無料でワイルドカード
証明書を取得できる
サービスに
16
• 無料で使える
• 何個でもSSL証明書を発行できる(レートリミットあり)
• ワイルドカード証明書も取れる
• 90日しか有効期限がないとはいえ、自動で更新して
デプロイ&Webサーバー再起動までしてくれる
Let’s Encrypt最高!!!🤤
自分のサイトのSSLをすべてLet’s Encryptへ移行させました
Let’s Encrypt のメリット
§2 さくらのクラウドDNSを使って
ワイルドカード証明書を”後から”取得
する方法
17
さくらのクラウドでは…
18
インスタンス立ち上げ時に
”スタートアップスクリプト”から
“Let’s Encrypt”
を選択すると自動でCertbotとさくらの
クラウドDNSとを連携させた状態で
インストールできる
コレ!
では、後からSSLが欲しくなった場合は
どうすればいい?
19
• ワイルドカードでない証明書を取得するとき
⇒ Webサーバーで対応できるので、Apacheプラグイン
やNginxプラグインを使用すればOK
• ワイルドカード証明書を取得するとき
⇒ DNS認証が必須になる
⇒ SSL証明書取得・更新時にDNSをCertbotから操作す
る手段が必要
Certbotとは?
20
• Let’s EncryptでSSL証明書申請・取得時に使用する、
自動ドメイン認証・SSL証明書デプロイツール
• 手続き方法はすべて”ACMEプロトコル”として
公開されている
• X.509証明書のドメイン検証、インストール、および管理を自動
化するための標準プロトコル(IETF RFC 8555)
• Let’s Encrypt以外でも自動認証を導入することができる
仕組みになっている。
CertbotからDNSをコントロールするには?
21
スクリプト、もしくはプラグインを使って、更新時に自動で
DNSのTXTレコードを書き換える。
例: MyDNS
22
• SSL更新時にスクリプトを走らせる”manual-auth-hook”
でLet’sEncryptからの検証前にDNSの値を書き換える
スクリプトを動かす
• リクエストの例 (github.com/disco-v8/DirectEdit から引用)
詳細は引用元をご覧ください。
certbot-auto certonly --manual ¥
--preferred-challenges=dns ¥
--manual-auth-hook /your/domain/directory/DirectEdit-
master/txtregist.php ¥
--manual-cleanup-hook /your/domain/directory/DirectEdit-
master/txtdelete.php ¥
-d yourdomain -d *.yourdomain ¥
--server https://acme-v02.api.letsencrypt.org/directory ¥
--agree-tos -m yourmailaddr ¥
--manual-public-ip-logging-ok
さくらのクラウド DNSの場合…
23
さくらのクラウド用Certbotプラグイン
“certbot-dns-sakuracloud"
を使用
• Python Package Index 上にプラグインが公開されている
⇒ pipコマンドから入手可能
pip install certbot-dns-sakuracloud
⚠️ 注意点
24
certbot-auto を使用している場合、Certbotがpyenvを
使ってインストールされているため、 pip install する
前にCertbotのpyenvの環境に入る必要がある
# certbotディレクトリへ移動
cd /opt/eff.org/certbot/venv
# certbotのpyenvに入る
source bin/activate
# certbot-dns-sakuracloudのインストール
pip install certbot-dns-sakuracloud
# pyenvから抜ける
deactivate
※ certbotディレクトリのパスは各環境に合わせてください。
さくらのクラウド アクセストークンの設定
25
• 適当な場所に “.sakura” ファイルを作成し、アクセス
トークンを書き込み
• 下記の内容で .sakura ファイルを適当な場所に作成
例: ~/.sakura
• 上記で作成した .sakura ファイルのパーミッションを変更
参考: さくらのクラウド APIキーの取得方法
さくらのクラウドDNS + Let’s Encrypt でワイルドカード証明書する! – Qiita
sudo chmod 600 ~/.sakura
dns_sakuracloud_api_token = 'アクセストークン'
dns_sakuracloud_api_secret = 'アクセストークンシークレット'
SSL証明書取得
26
• 次のコマンドの例に従って、SSL証明書を取得
sudo certbot-auto certonly ¥
--dns-sakuracloud # さくらのクラウドDNSプラグインの使用を指定 ¥
--dns-sakuracloud-credentials ~/.sakura # APIトークンを記述したファイルのパスを指定 ¥
-d example.com -d *.example.com # SSLを取得したいドメインを指定 ¥
-m mail@example.com # Let‘s Encryptから通知を受けるメールアドレスを指定 ¥
--agree-tos ¥ # 規約に同意 ¥
--manual-public-ip-logging-ok # グローバルIPアドレスのロギングを許可 ¥
--preferred-challenges dns-01 # DNS-01認証を使用(ワイルドカード証明書は必須) ¥
--server https://acme-v02.api.letsencrypt.org/directory # 認証サーバーURL ¥
--renew-hook “SSL証明書更新時に実行したいコマンド“ # 例: systemctl restart nginx
※ うまくいかないときは改行を消して実行してください。
認証に成功すると、証明書が発行されます!!!
SSL証明書の保存場所
27
• 取得したSSL証明書は以下のパスに保存される
• 中間証明書を含む証明書(公開鍵)
/etc/letsencrypt/live/証明書を申請したドメイン名/fullchain.pem
• 証明書(公開鍵)
/etc/letsencrypt/live/証明書を申請したドメイン名/cert.pem
• 中間証明書
/etc/letsencrypt/live/証明書を申請したドメイン名/chain.pem
• 証明書の秘密鍵
/etc/letsencrypt/live/証明書を申請したドメイン名/privkey.pem
あとは各サーバソフトに合わせて上記の証明書を設定すればOKです!
自動更新設定
28
• 取得時に指定したオプションは
/etc/letsencrypt/renewal/
配下に記録される
• certbotのrenewサブコマンドを1日に1度実行するように
設定すると、更新が必要な時のみ自動で更新してくれる
⇒ cronなどに定期実行を設定しておく
設定例(毎日午前3時にSSLのチェックと更新を行わせる設定):
0 3 * * * /usr/local/bin/certbot-auto renew >> /var/log/letsencrypt/ssl-renew.log 2>&1
補足(2021年3月時点)
29
• 現在、certbot-autoは非推奨となっており、新たにセット
アップする場合は使用ができない。
⇒各ディストリが提供する”certbot”コマンドを使用する。
sudo apt update
sudo apt install certbot
あとは”certbot-auto”コマンドを”certbot”コマンドに置き換えれば同じ手順でOKです。
例(Ubuntu 20.04 LTSの場合):
• Certbotのインストール
# ubuntuのリポジトリで公開されているので使用します。
sudo apt install python3-certbot-dns-sakuracloud
• certbot-dns-sakuracloud のインストール
苦労した点・所感
30
• Cron経由の更新がうまくいかず、試行錯誤した
• 自分はPHPメインで今まで触ってきていたので、Pythonの扱いになれず、pyenvの
入り方がわからなくて手間取った。(これを機にpythonを触れるようにしたい…)
• ワイルドカード証明書の手動取得の時はDNSの設定画面とターミナルを両方
開きながら操作する必要があったので大変だった
(認証タイムアウト、DNSの設定ミス誘発etc...)
• プラグインを使うと更新時もDNS認証を自動でやってくれるので、
トラブルが起きない限りメンテナンスフリーなのは嬉しい!
• ワイルドカード証明書が無料で使えるのはやっぱりうれしい!
• ACMEプロトコルがもっと多くの認証局で普及したらいいなと感じた
• 今後もどんどんLet’s Encryptを活用していきたいと思っている
引用元・参考サイト
31
• Let’s Encrypt 公式サイト
• Let's Encrypt 総合ポータル
• さくらのクラウドDNS + Let’s Encrypt でワイルドカード証明書する! – Qiita
• 【Let’s Encrypt】さくらのクラウドのDNSで「DNS-01 Challenge」を使ってみた –
TeraDas
• 無料でHTTPS化できる「Let’s Encrypt」をやってみた ※install.sh付き – Qiita
• さくらのクラウドDNS + Let’s Encrypt でワイルドカード証明書する! – Qiita
• Certbotプラグインをインストールする方法は? – QAStack
• ACMEプロトコルとは何ですか?
ありがとうございました!!!
32

さくらのクラウドDNS経由でワイルドカード証明書を後からインストールしたcertbotで取得する方法