Qiitaから移動させたコンテンツです。
さくらのクラウド ウェブアクセラレータでLet’s Encryptを使ってみよう。
追記(2021/01/29)
ウェブアクセラレータ自体にLet’s Encryptの自動更新機能がリリースされましたので、
以下のような苦労をする必要はなくなりました!🎉
概要
さくらのクラウド ウェブアクセラレータで独自ドメインを利用する場合、
SSL証明書をインストールすることで、SSL化できる(HTTP2も対応)ので、
Let’s Encryptの証明書を使ってみた話です。
やること
- Let’s Encryptで証明書を発行する
- API経由でSSL証明書を登録してみる
前提のお話し
- すでに独自ドメインでウェブアクセラレータが使える状態
- 今回はオリジンサーバをnginxで作っている想定
現在の状態
- オリジンサーバのnginxの設定
server {
listen 80;
server_name www.example.jp;
location / {
root /usr/share/nginx/html;
index index.html
add_header Cache-Control s-maxage=3600;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
- オリジンサーバのコンテンツを1時間(3600秒)キャッシュする状態
Let’s Encryptで証明書発行する準備をする
証明書発行ツールの準備
公式ではcertbotというツールを使うようですが、Python入れたりといろいろと面倒なので、golangで書かれたlegoというのを使います。
https://github.com/xenolf/lego/releases
既にビルド済みのバイナリがあるので、これをさくっと使おうと思います。
- ダウンロード(今回は64bit Linux)
# curl -L -O https://github.com/xenolf/lego/releases/download/v0.3.1/lego_linux_amd64.tar.xz
# tar xvf lego_linux_amd64.tar.xz
- コマンドが動くかテスト
# cd lego
# ./lego --verison
今回はこのlegoコマンドを使って、webroot(ドメイン認証ファイルを指定ディレクトリに配置して認証する)方式で
ドメインの所有チェックを行い証明書発行したいと思います。
ドメイン認証に使うファイルとキャッシュ
ドメイン認証で使用するファイルがウェブアクセラレータにキャッシュされると困るので、
キャッシュされないようにnginxの設定を追加します。
ドメイン認証に使うファイルはドキュメントルート以下の/.well-known/に配置する必要があるため、
/.well-known/ディレクトリ以下がキャッシュされないようlocationを分離します。
server {
listen 80;
server_name www.example.jp;
location / {
root /usr/share/nginx/html;
index index.html;
add_header Cache-Control s-maxage=3600;
}
+ location /.well-known/ {
+ root /usr/share/nginx/html;
+ index index.html;
+ }
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
ウェブアクセラレータはCache-Controlにs-maxageをつけないとキャッシュされません。
legoで証明書の発行をしてみる
# ./lego --path ./ --webroot /usr/share/nginx/html/ --email hoge@example.jp --domains www.example.jp --accept-tos run
問題なければ certificate というディレクトリの中に秘密鍵と証明書が入っています。
ファイル名 | 内容 |
---|---|
www.example.jp.crt | サーバ証明書と中間証明書 |
www.example.jp.key | 秘密鍵 |
このサーバ証明書と中間証明書をウェブアクセラレータに登録してやればSSLとして使えるはずです。
ウェブアクセラレータにAPIを使って証明書を登録
コントロールパネルからSSL証明書を登録することもできるのですが、自動更新を考えるとAPIを使った方が
今後のためになるかなと思いAPIでSSL証明書を登録してみました。
2017/12/21 追記 公式にAPIが公開されましたので、安心して更新できます!
ウェブアクセラレータ機能追加のお知らせ※ SSL証明書の登録APIは公開情報ではないみたい?です。コントロールパネルがアクセスしている
APIを調べて使っていますが、ドキュメントに載っていないAPIなので・・・自己責任で!
まず、さくらのクラウドのAPIトークンを取得しておきます。
さくらのクラウド APIについての説明は割愛します。
API経由で証明書を設定
# curl -X POST --user "Access Token":"Access Token Secret" \
https://secure.sakura.ad.jp/cloud/zone/is1a/api/webaccel/1.0/site/<サイトID>/certificate \
-d "{\"Certificate\": { \"CertificateChain\": \"$(perl -pe 's/\n/\\n/' certificates/www.example.jp.crt | perl -pe 's/\\n$//')\", \"Key\": \"$(perl -pe 's/\n/\\n/' certificates/www.example.jp.key | perl -pe 's/\\n$//')\" }}" | jq .
※ APIトークン、<サイトID>、 証明書ファイル名は適時書き換えてください。
無事登録が完了すると https://www.example.jp/ にアクセスするとLet’s Encryptの証明書で無事サイトが表示されているはずです。
最後に
SSL証明書証明書の更新もLet’s Encrypt+さくらのクラウドAPIを使えば、自動で更新する仕組みが作れそうです。
以下のコマンドを叩くだけで、証明書の更新ができそうだということで、お手軽そうです。
# ./lego --path ./ --webroot /usr/share/nginx/html/ --email hoge@example.jp --domains www.example.jp --accept-tos renew
# curl -X PUT --user "Access Token":"Access Token Secret" \
https://secure.sakura.ad.jp/cloud/zone/is1a/api/webaccel/1.0/site/<サイトID>/certificate \
-d "{\"Certificate\": { \"CertificateChain\": \"$(perl -pe 's/\n/\\n/' certificates/www.example.jp.crt | perl -pe 's/\\n$//')\", \"Key\": \"$(perl -pe 's/\n/\\n/' certificates/www.example.jp.key | perl -pe 's/\\n$//')\" }}" | jq .