这是从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 .