使用acme申请https证书

随着互联网的飞速发展,http这种明文传输协议已经越来越无法满足建站的需求,因此当今绝大多数网站都已经切换到了https。虽然https协议使用TLS加密极大地提高了传输安全性,但也带来了更大的部署难度,首当其冲的就是TLS证书申请,本文将介绍如何使用acme免费申请一个供个人使用的证书。

准备工作

虽然说是免费申请,但我们还是需要一些前置条件,其中最重要的就是

  1. 一个域名。
  2. 一个公网IP(v4或者v6都可以)。

此外,还需要一个Linux环境来执行acme程序。

安装acme

证书申请的原理就是向一些证书发行组织,如letsencryptzerossl等,发送域名和服务器等信息,如果信息校验成功,这些组织就会给我们颁发TLS证书。

由于与证书颁发服务器之间的通信协议较为繁琐,我们需要使用程序来完成这一系列操作,而acme就是用来完成这项工作的脚本程序。

根据使用系统环境的不同,acme的安装方式也不尽相同。

标准发行版

如Ubuntu、Debian、CentOS等。

在线安装

1
2
curl https://get.acme.sh | sh -s email=my@example.com
wget -O - https://get.acme.sh | sh -s email=my@example.com

离线安装

1
2
3
git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install -m my@example.com

申请的证书保存在~/.acme.sh/$domain中。

OpenWRT

安装以下包

1
2
3
4
5
luci-app-acme
acme
acme-deploy
acme-dnsapi
acme-notify

申请的证书保存在/etc/acme/$domain中。

证书申请

根据网站部署方式的不同,使用acme申请证书的方式也不相同。

使用DNS API申请证书

要使用DNS API,通常都需要获取一个API Key。acme要求我们在使用DNS API之前设置相关环境变量。

设置环境变量

Cloudflare

打开https://dash.cloudflare.com/profile/api-tokens,查看Global API Key,并设置以下环境变量。

1
2
3
export CF_Key=""
export CF_Email=""
export DNS_API='dns_cf'

Dynv6

打开https://dynv6.com/keys/token/new,创建一个新的HTTP Token。

创建本地ssh公私钥,并将公钥~/.ssh/id_ed25519.pub上传到https://dynv6.com/keys中的SSH Public Keys

1
ssh-keygen -t ed25519

设置环境变量

1
2
3
export KEY="~/.ssh/id_ed25519.pub"
export DYNV6_TOKEN=""
export DNS_API='dns_dynv6'

申请证书

标准发行版

执行以下脚本之前,相关的环境变量必须已经设置好。

域名可以填入多个,用空格分隔,这样多个域名可以共享同一个证书。

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
# Related environment variables must have been exported before

# the first is the main domain
domain_list='example.org sub.example.org *.sub.example.org'
for domain in $domain_list
do
domain_opt="$domain_opt -d $domain"
done

~/.acme.sh/acme.sh --issue --dns $DNS_API $domain_opt --server letsencrypt

OpenWRT

打开服务 > ACME证书

域名这一项里面添加所需的域名,在DNS API这一项里面填入环境变量$DNS_API的值,最后分别将其它环境变量填入DNS API 凭证中。

证书使用

为了确保证书的最佳兼容性,证书文件使用fullchain.cer,而密钥文件使用$domain.key

参考

动态域名商Dynv6之acme使用dnsapi申请证书