usacloudとlego(Let's encrypt)でウェブアクセラレータの証明書更新を自動化

## Usacloudでウェブアクセラレータがサポートされたよ

さくらのクラウド CLI [Usacloud](https://github.com/sacloud/usacloud)のv0.9からウェブアクセラレータの操作がサポートされるようになりました。

今回はこの機能を利用してLet's encryptで証明書を更新&ウェブアクセラレータに登録した証明書の更新を自動化してみます。

**===UPDATE: 2021-02-04**

- 現在はウェブアクセラレータ側でLet’s Encrypt 自動更新証明書機能が提供されていますのでこちらも併せてご検討ください。
(詳細は[@hnakamurさんのコメント](#comment-079045d40905753b5b36)を参照してください)

- Usacloudは現在v1.0系が最新となっています。
コマンドやオプションの名前が変更されている箇所がありますので適宜読み替えてください。

- 記事執筆時点では初回の証明書登録をコンパネから行う形でしたが、現在はAPIが公式に提供されています。
詳細は[さくらのクラウド ドキュメント](https://manual.sakura.ad.jp/cloud/webaccel/api.html#id23)を参照してください。 

**===UPDATEここまで**

## 前提条件

今回、Let's encryptでの証明書の更新はDNSを用いる方法(DNS-01)を利用します。
もしHTTPを利用する場合は以下の記事が参考になると思います。

[参考: さくらのクラウド ウェブアクセラレータでLet's Encryptを使う](https://qiita.com/masa23/items/f17c148d4c941d6f2ed4)

DNSサーバはさくらのクラウドDNSを利用します。
(他のDNSサーバを利用する場合は適宜読み替えてください)

## 準備

自動化のために以下のプロダクトを利用します。

- `usacloud` : さくらのクラウド CLI
- `lego` : go言語製のLet's encryptクライアント

Usacloudについては以下のドキュメントなどを参考にインストール&APIキーの設定を行ってください。

[Usacloud 導入ガイド](https://sacloud.github.io/usacloud/start_guide/#_2)

**>>> 2018/10/18 更新

さくらのクラウド対応が含まれる lego v1.1.0がリリースされました。

https://github.com/xenolf/lego/releases/tag/v1.1.0

legoは[こちら](https://github.com/xenolf/lego/releases/tag/v1.1.0)からv1.1.0の実行ファイルをダウンロードしてご利用ください。

~~legoについては現在lego本体にさくらのクラウドDNS対応をPR投げてます。~~
~~(この辺の詳細は[こちらの記事](https://qiita.com/yamamoto-febc/items/290d5c455fe5b4f285bf)に書きました)~~

~~今回はさくらのクラウド対応用にforkしたバージョンを利用します。~~
~~以下からlegoのバイナリをダウンロードしておいてください。~~

~~[lego:さくらのクラウド対応バージョン](http://github.com/sacloud/lego/releases/latest)~~

**<<< 2018/10/18 追記

## 証明書更新の自動化までの手順

1. さくらのクラウドDNSにゾーン登録
2. legoで証明書発行
3. コントロールパネルから初回の証明書登録
4. lego+usacloudで証明書の更新自動化

順番に説明します。

## 1. さくらのクラウドDNSにゾーン登録

Let's encryptでDNS-01認証を行うためにさくらのクラウドDNSを利用します。
まださくらのクラウドDNSにゾーン登録していない場合は以下のコマンドで登録できます。
(`example.com`の部分を適宜置き換えてください)

```bash
usacloud dns create --name example.com
```

ゾーン登録後はレジストラのネームサーバの設定が必要です。
以下のコマンドでDNSサーバの情報を確認できますので、ネームサーバの設定を行っておいてください。

```console
$ usacloud dns ls #以下の"NameServers"にDNSサーバの情報が表示される
+--------------+--------------+-------------------------------------------------+
|      ID      |     Name     |                   NameServers                   |
+--------------+--------------+-------------------------------------------------+
| 123456789012 | example.com  | ns1.gslb4.sakura.ne.jp / ns2.gslb4.sakura.ne.jp |
+--------------+--------------+-------------------------------------------------+
```

## 2. legoで証明書発行

続いてlegoを利用して証明書の発行を行います。
以下のコマンドでLet's encryptでDNS-01認証を用いて証明書発行が行われます。

```bash
DOMAIN="www.example.com"       # ドメイン名
EMAIL="example@example.com"    # メールアドレス
CERTS_PATH="/home/ubuntu/lego" # legoのデータ(証明書や秘密鍵)格納先 

# さくらのクラウドAPIキーを環境変数に設定しておく
export SAKURACLOUD_ACCESS_TOKEN=<your-token>
export SAKURACLOUD_ACCESS_TOKEN_SECRET=<your-secret>


# legoで証明書発行
lego --email="${EMAIL}" --domains="${DOMAIN}" --dns="sakuracloud" --path ${CERTS_PATH} run
```

発行に成功すると`${CERTS_PATH}/certificates`ディレクトリ内に証明書や秘密鍵が作成されています。

## 3. コントロールパネルから初回の証明書登録

次に、発行した証明書をウェブアクセラレータに登録します。
初回の証明書登録は現在API経由では行えませんのでコントロールパネルから設定しておきます。

以下のドキュメントを参考に設定してください。
[【ウェブアクセラレータ】独自ドメインSSLの利用](https://manual.sakura.ad.jp/cloud/webaccel/manual/settings-domain-ssl.html)

## 4. lego+usacloudで証明書の更新自動化

続いて証明書更新処理を自動化します。

以下のスクリプトでlegoで証明書更新し、更新が成功したらusacloudでウェブアクセラレータの証明書更新処理を行います。

```bash
#!/bin/bash

DOMAIN="www.example.com"       # ドメイン名
EMAIL="example@example.com"    # メールアドレス
CERTS_PATH="/home/ubuntu/lego" # legoのデータ(証明書や秘密鍵)格納先           
SITE_NAME="www.example.com"    # ウェブアクセラレータに登録したサイト名

# さくらのクラウドAPIキーを環境変数に設定しておく
export SAKURACLOUD_ACCESS_TOKEN=<your-token>
export SAKURACLOUD_ACCESS_TOKEN_SECRET=<your-secret>

# legoで証明書更新
lego --email="${EMAIL}" --domains="${DOMAIN}" --dns="sakuracloud" --path ${CERTS_PATH} renew

# usacloudでウェブアクセラレータの証明書更新
usacloud web-accel cert-update -y --cert ${CERTS_PATH}/certificates/${DOMAIN}.crt --key ${CERTS_PATH}/certificates/${DOMAIN}.key ${SITE_NAME}
```

後はこのスクリプトをcronなどで定期的に実行するようにすれば良いでしょう。

## おまけ: 証明書の有効期限監視

さくらのクラウドでは[シンプル監視](https://manual.sakura.ad.jp/cloud/appliance/simplemonitor/index.html#ssl)というサービスで証明書の有効期限の監視が可能です。
更新処理が失敗していた場合に備えて設定しておくことをお勧めします。

Usacloudの場合は以下のコマンドでシンプル監視の設定が行えます。

```bash
usacloud simple-monitor create --protocol ssl-certificate --target www.example.com --remaining-days 30
```

`--remaining-days`パラメータで証明書の有効残日数を指定できます(この値を下回ると通知される)。
デフォルトではさくらのクラウドのアカウントに紐づいたメールアドレス宛に通知されますが、設定を変更すればSlackにも通知可能ですのでお好きな方をご利用ください。

以上です。Enjoy!!