@qidiandasheng
2019-01-19T17:15:59.000000Z
字数 4327
阅读 1832
网络
Let's Encrypt是一个于2015年三季度推出的数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的SSL/TLS证书。
Let's Encrypt由互联网安全研究小组(缩写ISRG)提供服务。主要赞助商包括电子前哨基金会、Mozilla基金会、Akamai以及思科。2015年4月9日,ISRG与Linux基金会宣布合作。
用以实现新的数字证书认证机构的协议被称为自动证书管理环境(ACME)。GitHub上有这一规范的草案,且提案的一个版本已作为一个Internet草案发布。
Let's Encrypt宣称这一过程将十分简单、自动化并且免费
简单来说acme.sh 实现了 acme 协议, 可以从 let‘s encrypt 生成免费的证书。
acme.sh 有以下特点:
~# curl https://get.acme.sh | sh
acme.sh安装完成后会在~/.acme.sh/
目录下,并创建 一个 bash 的 alias, 输入alias
能看到设置的别名为:
alias acme.sh='/root/.acme.sh/acme.sh'
然后创建一个cronjob
,每天 12:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。输入crontab -l
就能看到设置的cronjob:
12 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证。
1.需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了:
//创建存放证书的目录
~# mkdir /etc/ssl/www.mydomain.com
//申请证书,下面这段过程将会往 /var/www/html 创建一个 .well-known 的文件夹
//.well-known 文件夹是申请SSL时自动生成的,删除不影响SSL工作,但是当SSL过期续期后会再次自动生成
//同时 Let’ s Encrypt 将会通过你要注册的域名去访问那个文件来确定权限
~# acme.sh --issue -d www.mydomain.com -w /var/www/html --key-file "/etc/ssl/www.mydomain.com/privkey.pem" --fullchain-file "/etc/ssl/www.mydomain.com/fullchain.pem"
2.(推荐)如果你用的 nginx服务器, 或者反代, acme.sh 还可以智能的从 nginx的配置中自动完成验证, 你不需要指定网站根目录:
~# acme.sh --issue -d www.mydomain.com --nginx --key-file "/etc/ssl/www.mydomain.com/privkey.pem" --fullchain-file "/etc/ssl/www.mydomain.com/fullchain.pem"
server {
listen 80;
server_name www.mydomain.com;
rewrite ^ https://$server_name$request_uri? permanent;
}
server {
listen 443 ssl;
ssl on;
ssl_certificate /etc/ssl/www.mydomain.com/fullchain.pem;
ssl_certificate_key /etc/ssl/www.mydomain.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
server_name www.mydomain.com;
if ($http_user_agent ~* (baiduspider|360spider|haosouspider|googlebot|soso|bing|sogou|yahoo|sohu-search|yodao|YoudaoBot|robozilla|msnbot|MJ12bot|NHN|Twiceler)) {
return 403;
}
location /native_push_technology {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:7300;
}
}
.well-known/acme-challenge
下的文件。如果先重定向了就会先去请求https,然后这时候证书又还没申请好,所以会报错:
www.mydomain.com:Verify error:Invalid response from http://www.mydomain.com/.well-known/acme-challenge/iomyGA5e5hMdabZrDZ8LEBr1GICy7Bpmo4zNfaw7ctI:
这种方式的好处是, 你不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证。
这种方式的缺点是,如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
~# acme.sh --issue -d www.mydomain.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
以下是acme.sh的输出,然后得到domain和TXT value,然后在域名管理面板中添加这条 txt 记录。
在DNS解析里加入TXT之后过一小段时间,然后验证解析是否生效:
➜ Desktop dig -t txt _acme-challenge.sstest3.qidiandasheng.com @8.8.8.8
; <<>> DiG 9.10.6 <<>> -t txt _acme-challenge.sstest3.qidiandasheng.com @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53209
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;_acme-challenge.sstest3.qidiandasheng.com. IN TXT
;; ANSWER SECTION:
_acme-challenge.sstest3.qidiandasheng.com. 599 IN TXT "Nf72fLXvnRaWCLUHwhcU5ucIupg8KaZz2IvcTBmaclE"
;; Query time: 1351 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sat Jan 19 15:44:06 CST 2019
;; MSG SIZE rcvd: 126
TXT解析成功后即可申请证书了:
~# acme.sh --renew --dns -d sstest3.qidiandasheng.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
acme.sh 支持直接使用主流 DNS 提供商的 API 接口来完成域名验证以及一些相关操作。具体查看 dnsapi 链接。
这里以 阿里云 为例:
1.获取阿里云API Key
https://usercenter.console.aliyun.com/#/accesskey
2.终端配置文件中设置
export Ali_Key="LTAIudrtYc6RScUC"
export Ali_Secret="CCji66AURIMofiMTSELGjJDLKPJ1dd"
3.发起证书申请
~# acme.sh --issue --dns dns_ali -d sstest4.qidiandasheng.com
Ali_Key 和 Ali_Secret 将被保存在 ~/.acme.sh/account.conf
, 命令中 dns_ali
指明使用 阿里的dns。
一般在申请证书的时候可以直接生成可用的证书和私钥,如http方式生成证示例所示,即添加以下代码:
--key-file "/etc/ssl/www.mydomain.com/privkey.pem" --fullchain-file "/etc/ssl/www.mydomain.com/fullchain.pem
如果没设置的话,会把生成最终证书需要的各种文件默认下载在/root/.acme.sh/www.mydomain.com/
文件夹里,然后可以执行以下命令安装证书:
~# acme.sh --installcert -d www.mydomain.com \
--key-file /etc/ssl/privkey.key \
--fullchain-file /etc/ssl/fullchain.cer \
--reloadcmd "service nginx force-reload"