[关闭]
@qidiandasheng 2019-01-19T17:15:59.000000Z 字数 4327 阅读 1889

创建Https证书

网络


Let's Encrypt简介

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.sh 实现了 acme 协议, 可以从 let‘s encrypt 生成免费的证书。
acme.sh 有以下特点:

acme.sh的使用

安装

  1. ~# curl https://get.acme.sh | sh

acme.sh安装完成后会在~/.acme.sh/目录下,并创建 一个 bash 的 alias, 输入alias能看到设置的别名为:

  1. alias acme.sh='/root/.acme.sh/acme.sh'

然后创建一个cronjob,每天 12:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。输入crontab -l就能看到设置的cronjob:

  1. 12 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证。

http 方式生成证书

1.需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了:

  1. //创建存放证书的目录
  2. ~# mkdir /etc/ssl/www.mydomain.com
  3. //申请证书,下面这段过程将会往 /var/www/html 创建一个 .well-known 的文件夹
  4. //.well-known 文件夹是申请SSL时自动生成的,删除不影响SSL工作,但是当SSL过期续期后会再次自动生成
  5. //同时 Let’ s Encrypt 将会通过你要注册的域名去访问那个文件来确定权限
  6. ~# 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的配置中自动完成验证, 你不需要指定网站根目录:

  1. ~# 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"

配置Ngnix文件

  1. server {
  2. listen 80;
  3. server_name www.mydomain.com;
  4. rewrite ^ https://$server_name$request_uri? permanent;
  5. }
  6. server {
  7. listen 443 ssl;
  8. ssl on;
  9. ssl_certificate /etc/ssl/www.mydomain.com/fullchain.pem;
  10. ssl_certificate_key /etc/ssl/www.mydomain.com/privkey.pem;
  11. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  12. ssl_ciphers HIGH:!aNULL:!MD5;
  13. server_name www.mydomain.com;
  14. if ($http_user_agent ~* (baiduspider|360spider|haosouspider|googlebot|soso|bing|sogou|yahoo|sohu-search|yodao|YoudaoBot|robozilla|msnbot|MJ12bot|NHN|Twiceler)) {
  15. return 403;
  16. }
  17. location /native_push_technology {
  18. proxy_set_header X-Real-IP $remote_addr;
  19. proxy_set_header Host $http_host;
  20. proxy_pass http://127.0.0.1:7300;
  21. }
  22. }

注意

  1. 配置nginx的时候在申请证书之前server配置文件先别重定向到https,因为它在生成证书的时候会通过你的域名请求.well-known/acme-challenge下的文件。如果先重定向了就会先去请求https,然后这时候证书又还没申请好,所以会报错:
  1. www.mydomain.com:Verify error:Invalid response from http://www.mydomain.com/.well-known/acme-challenge/iomyGA5e5hMdabZrDZ8LEBr1GICy7Bpmo4zNfaw7ctI:

dns方式生成证书

这种方式的好处是, 你不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证。
这种方式的缺点是,如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。

手动添加TXT解析记录

  1. ~# acme.sh --issue -d www.mydomain.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

以下是acme.sh的输出,然后得到domain和TXT value,然后在域名管理面板中添加这条 txt 记录。

屏幕快照 2019-01-19 下午3.58.41.png-880.4kB

屏幕快照 2019-01-19 下午4.03.12.png-65kB

在DNS解析里加入TXT之后过一小段时间,然后验证解析是否生效:

  1. Desktop dig -t txt _acme-challenge.sstest3.qidiandasheng.com @8.8.8.8
  2. ; <<>> DiG 9.10.6 <<>> -t txt _acme-challenge.sstest3.qidiandasheng.com @8.8.8.8
  3. ;; global options: +cmd
  4. ;; Got answer:
  5. ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53209
  6. ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
  7. ;; OPT PSEUDOSECTION:
  8. ; EDNS: version: 0, flags:; udp: 512
  9. ;; QUESTION SECTION:
  10. ;_acme-challenge.sstest3.qidiandasheng.com. IN TXT
  11. ;; ANSWER SECTION:
  12. _acme-challenge.sstest3.qidiandasheng.com. 599 IN TXT "Nf72fLXvnRaWCLUHwhcU5ucIupg8KaZz2IvcTBmaclE"
  13. ;; Query time: 1351 msec
  14. ;; SERVER: 8.8.8.8#53(8.8.8.8)
  15. ;; WHEN: Sat Jan 19 15:44:06 CST 2019
  16. ;; MSG SIZE rcvd: 126

TXT解析成功后即可申请证书了:

  1. ~# acme.sh --renew --dns -d sstest3.qidiandasheng.com --yes-I-know-dns-manual-mode-enough-go-ahead-please

API 接口方式添加TXT解析记录

acme.sh 支持直接使用主流 DNS 提供商的 API 接口来完成域名验证以及一些相关操作。具体查看 dnsapi 链接

这里以 阿里云 为例:

1.获取阿里云API Key

https://usercenter.console.aliyun.com/#/accesskey

2.终端配置文件中设置

  1. export Ali_Key="LTAIudrtYc6RScUC"
  2. export Ali_Secret="CCji66AURIMofiMTSELGjJDLKPJ1dd"

3.发起证书申请

  1. ~# acme.sh --issue --dns dns_ali -d sstest4.qidiandasheng.com

Ali_Key 和 Ali_Secret 将被保存在 ~/.acme.sh/account.conf , 命令中 dns_ali 指明使用 阿里的dns。

安装证书

一般在申请证书的时候可以直接生成可用的证书和私钥,如http方式生成证示例所示,即添加以下代码:

  1. --key-file "/etc/ssl/www.mydomain.com/privkey.pem" --fullchain-file "/etc/ssl/www.mydomain.com/fullchain.pem

如果没设置的话,会把生成最终证书需要的各种文件默认下载在/root/.acme.sh/www.mydomain.com/文件夹里,然后可以执行以下命令安装证书:

  1. ~# acme.sh --installcert -d www.mydomain.com \
  2. --key-file /etc/ssl/privkey.key \
  3. --fullchain-file /etc/ssl/fullchain.cer \
  4. --reloadcmd "service nginx force-reload"

参考

acme.sh中文说明
https之acme.sh申请证书
acme.sh 配合 letsencrypt 配置泛域名

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注