申请证书之前你当然需要有一个自己的域名,你可以在各种registar那儿注册,如name,namecheap,spaceship等。
你可以通过tld-list来查看市面主流registry的优惠信息。
acme通过dns记录验证或网站验证来获取证书。详细的验证细节可以参考let’s encrypt的说明。
安装acme.sh
curl https://get.acme.sh | sh -s email=my@example.com
在使用 acme.sh 时需要使用邮箱地址在对应的 CA 处注册一个账户用于申请证书,如默认的zerossl。你也可以不带-s email=my@example.com
,之后再创建。
官方说明中指出安装脚本会做的事情:
把 acme.sh 安装到你的 /home/user 目录或者/root下
~/.acme.sh/acme.sh
创建一个 shell 的 alias, 例如 .bashrc,方便你的使用:
alias acme.sh=~/.acme.sh/acme.sh
自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。
创建账户
官方支持的server简写,使用命令设置默认CA。如:
acme.sh –set-default-ca –server letsencrypt
acme.sh –set-default-ca –server zerossl
创建账户:
acme.sh –register-account -m your-email@example.com
创建的账户资料会保存在~/.acme.sh/acme.sh/ca
如果你想使用 GTS(Google Trust Services)CA:google官方说明
在Console中的 IAM和管理
中先创建项目,在网页中使用 cloud shell申请EAB密钥
gcloud publicca external-account-keys create
再在本机acme中使用生成的密钥注册:
acme.sh --register-account -m "EMAIL" --server google --eab-kid "EAB_KID" --eab-hmac-key "HMAC_KEY"
eab-hmac-key
是比较长的那个,测试和正式环境需要重新生成密钥单独注册,密钥被注册使用后后会失效。
使用dns_api
DNS 验证无需物理托管,无论服务器的物理位置如何,或者是否有多个服务器,只要能控制 DNS 记录,就可以为域名颁发证书。DNS 验证显示了对域名 DNS 记录的控制权,这通常意味着更高级别的认证和安全保障,通配符证书往往需要DNS验证。
你通常可以比较轻松地获取dns提供商的api来配合acme.sh使用,acme.sh已经编写好了许多市面上常用的dns服务商的脚本内置于项目中。
以cloudflare为例:
cloudflare对应的脚本是dns_cf
,在命令中添加 --dns dns_cf
使用。
使用前我们去cloudflare获取对应的域名dns修改权限的API令牌。
去往右上角我的个人资料
中。
在API令牌
中创建令牌
在权限
中选择编辑
,在区域资源
中添加你需要申请证书的域名,在客户端IP筛选
中添加你使用acme.sh 的主机IP地址,增加安全性。
继续以创建令牌
然后cloudflare会自动为你生成API令牌
接下来,我们使用这个API令牌来进行证书申请,在shell中输入并回车,记得替换为你刚申请的API令牌:
export CF_Token="Your_CF_Token"
export命令会生成一个环境变量,使用printenv可以查看所有环境变量
使用过一次的CF_Token会自动存储在~/.acme.sh/acme.sh/account.conf
所以你也可以直接修改~/.acme.sh/acme.sh/account.conf
添加:
SAVED_CF_Token='Your_CF_Token'
最后你可以使用acme.sh申请证书
acme.sh --issue --server google -d *.你的域名 --dns dns_cf --keylength ec-256
修改以下命令,将证书安装到你想要的地方
acme.sh --install-cert -d 你的域名 \ --cert-file "/path/to/你的域名.cer" \ --key-file "/path/to/你的域名.key" \ --fullchain-file "/path/to/你的域名_fullchain.cer" \ --reloadcmd "sudo service nginx force-reload"