申请证书之前你当然需要有一个自己的域名,你可以在各种域名注册商注册,如name,namecheap,spaceship等。
你可以通过tld-list来查看市面主流域名注册商的优惠信息(优惠码),spaceship经常打折,提供免费的邮件转发。
acme通过dns记录验证或网站验证来获取证书。详细的验证技术细节可以参考let’s encrypt的说明。使用dns记录验证可以规避网站配置的麻烦(你可能需要为了能够验证而修改nginx配置,特别是当你已经使用nginx),但是使用dns记录验证意味着你需要使用acme.sh 的 dns_api
,需要你获取域名解析服务商的密钥或者api之类的。
安装acme.sh
curl https://get.acme.sh | sh -s [email protected]
在使用 acme.sh 时需要使用邮箱地址在对应的 CA 处注册一个账户用于申请证书,如默认的zerossl。你也可以不带-s [email protected]
,之后再创建。
官方说明中指出安装脚本会做的事情:
把 acme.sh 安装到你的 /home/user 或者/root下的
~/.acme.sh/acme.sh
创建一个 shell 的 alias(别名), 例如 .bashrc,方便你的使用:
alias acme.sh=~/.acme.sh/acme.sh
自动为你创建 cronjob(定时任务), 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。 可以通过
crontab -l
检查
创建账户
官方支持的CA简写,使用命令更改默认CA(证书签发机构)。如:
acme.sh --set-default-ca --server letsencrypt
acme.sh --set-default-ca --server zerossl
acme.sh --set-default-ca --server google
创建账户:
acme.sh --register-account -m [email protected]
创建的账户资料会保存在~/.acme.sh/acme.sh/ca
如果你想使用 GTS(Google Trust Services)CA,你无法直接通过acme.sh注册账户,而需要先在Google Cloud中注册: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 记录的控制权,这通常意味着更高级别的认证和安全保障,通配符证书(*.example.tld)只能通过DNS验证。
你通常可以比较轻松地获取域名解析提供商(如cloudflare、azure、dnspod等)的api来配合acme.sh使用,acme.sh已经编写好了许多市面上常用的域名解析服务商的脚本内置于项目中;如果你想自己使用bind9为自己的域名搭建解析服务,参考搭建域名解析服务和nsupdate使用方法。
以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
,不需要每次都export
所以你也可以直接修改~/.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 可以通过--server 选择别的CA acme.sh --issue --dns dns_cf -d www.example.com
修改以下命令,将证书“安装”到你想要的地方
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"
reloadcmd "sudo service nginx force-reload"
是重启nginx的命令,让nginx使用新的证书;--fullchain-file
不是必须安装的