在さくら云端的Web加速器(CDN)中使用Let's Encrypt
Web加速器 服务器
Lastmod: 2021-01-29
Published: 2017-01-25

这是从Qiita迁移过来的内容。

让我们在さくら云端Web加速器中使用Let’s Encrypt。

追记(2021/01/29)

Web加速器本身已经发布了Let’s Encrypt的自动更新功能,因此,
不再需要像下面这样费劲了!🎉

概要

さくら云端Web加速器中使用独立域名时,
通过安装SSL证书,可以实现SSL化(也支持HTTP2),
因此我们尝试使用Let’s Encrypt的证书。

要做的事情

  • 通过Let’s Encrypt申请证书
  • 通过API注册SSL证书

前提条件

  • 已经可以使用独立域名进行Web加速器的状态
  • 本次假设使用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

已经有构建好的二进制文件,因此我们将快速使用它。

  • 下载(此次为64位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(将域名验证文件放置在指定目录进行验证)方式进行
域名拥有权检查并申请证书。

用于域名验证的文件与缓存

为了避免域名验证使用的文件被Web加速器缓存,
需要在nginx配置中添加一条设置以确保不被缓存。

域名验证使用的文件需要放置在文档根目录下的/.well-known/中,因此,
需要将/.well-known/目录设置为不被缓存。

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;
    }
}

Web加速器必须在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私钥

只需将该服务器证书和中间证书注册到Web加速器即可作为SSL使用。

使用API将证书注册到Web加速器

虽然也可以通过控制面板注册SSL证书,但考虑到自动更新,
使用API可能更有利于未来,因此我尝试通过API注册SSL证书。

2017/12/21追记 官方已公开API,更新变得安心!
Web加速器功能新增通知
请注意,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证书的更新通过Lets 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 .