さくらのクラウド ウェブアクセラレータ(CDN)でLet's Encryptを使う
ウェブアクセラレータ サーバ
Lastmod: 2021-01-29
Published: 2017-01-25

これは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 --version

今回はこの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 .