Total Pageviews

Wednesday 31 October 2018

用acme.sh安装letsencrypt的免费SSL证书并自动续期(真是好爽)

本篇文章就来分享一下利用acme.sh来一键申请和安装letsencrypt免费SSL证书,基本上可以适合各大VPS主机服务器,而且acme.sh可以自动更新SSL证书,再也不用担心SSL证书会过期的问题的。从我的个人使用经验来看,官方推荐的Certbot还是不如acme.sh好用。

一、第一步:一键安装acme.sh
https://github.com/Neilpang/acme.sh

git clone https://github.com/Neilpang/acme.sh
cd acme.sh
./acme.sh --install
会显示:
[Fri Nov 16 12:33:04 EST 2018] Installing to /root/.acme.sh
[Fri Nov 16 12:33:04 EST 2018] Installed to /root/.acme.sh/acme.sh
[Fri Nov 16 12:33:04 EST 2018] Installing alias to '/root/.bashrc'
[Fri Nov 16 12:33:04 EST 2018] OK, Close and reopen your terminal to start using acme.sh
[Fri Nov 16 12:33:04 EST 2018] Installing alias to '/root/.cshrc'
[Fri Nov 16 12:33:04 EST 2018] Installing alias to '/root/.tcshrc'
[Fri Nov 16 12:33:04 EST 2018] Installing cron job
50 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
[Fri Nov 16 12:33:04 EST 2018] Good, bash is found, so change the shebang to use bash as preferred.
[Fri Nov 16 12:33:04 EST 2018] OK

(注:如果此命令自动创建计划任务失败,我们可以去自定义,比如:
0 0 * * * "/home/yee/.acme.sh"/acme.sh --cron --home "/home/yee/.acme.sh" > /dev/null)

脚本主要做了以下事情:
1.生成复制了acme.sh 到你的($HOME): ~/.acme.sh/目录下 ,后面所有的证书都会在这个目录生成.
2.Create alias for: acme.sh=~/.acme.sh/acme.sh. 注意:安装完成后你需要关闭再打开终端才可以让alias 生效。
3.增加了一个定时任务,用于SSL证书更新.
你可以使用Crontab -l来查看当前的定时任务.

安装socat:

apt-get install -y socat (centos系统下,则为yum install -y socat

如果在你的vps上无法成功安装socat,请跳到下面的2.4部分。

二、第二步:一键签发SSL证书
2.1  单个域名SSL,
./acme.sh --issue -d mydomain.com --standalone
会显示:
[Thu Nov  1 19:21:15 EDT 2018] Your cert is in  /root/.acme.sh/mydomain.com/mydomain.com.cer 
[Thu Nov  1 19:21:15 EDT 2018] Your cert key is in  /root/.acme.sh/mydomain.com/mydomain.com.key 
[Thu Nov  1 19:21:16 EDT 2018] The intermediate CA cert is in  /root/.acme.sh/mydomain.com/ca.cer 

[Thu Nov  1 19:21:16 EDT 2018] And the full chain certs is there:  /root/.acme.sh/mydomain.com/fullchain.cer

注意:如果等了2分钟,还没有生成证书,说明你的acme.sh的版本太低了,需要升级,方能解决问题。升级的办法:./acme.sh --upgrade

#默认签发的是RSA,如果你想签发ECC证书,请使用以下命令
./acme.sh --issue -d mydomain.com --standalone --keylength ec-256

2.2  多个域名SSL
./acme.sh --issue -d mydomain.com -d www.mydomain.com -d cp.mydomain.com --standalone
#默认签发的是RSA,如果你想签发ECC证书,请使用以下命令
./acme.sh --issue -d mydomain.com -d www.mydomain.com -d cp.mydomain.com --standalone --keylength ec-256

2.3  泛域名SSL
注意:泛域名SSL证书签发要用到DNS验证的方式,参考2.4部分。
./acme.sh --issue --dns dns_dp -d mydomain.com -d *.mydomain.com
#默认签发的是RSA,如果你想签发ECC证书,请使用以下命令
acme.sh --issue --dns dns_dp -d mydomain.com -d *.mydomain.com --keylength ec-256
#可选长度有:
   ec-256 (prime256v1, “ECDSA P-256”)
   ec-384 (secp384r1, “ECDSA P-384”)

2.4  无法验证域名?
(acme.sh实现了acme协议支持的所有验证协议,建议用http方式验证域名的所有权

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

./acme.sh --issue -d mydomain.com --webroot /var/www/mydomain.com/
你需要手动创建/var/www/mydomain.com/目录。
只需要绑定域名到你的网站的根目录,acme.sh会自动生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用.
注意, 无论是 apache webserver还是 nginx webserver, acme.sh在完成验证之后, 会恢复到之前的状态, 都不会私自更改你本身的配置. 好处是你不用担心配置被搞坏, 也有一个缺点, 你需要自己配置 ssl 的配置, 否则只能成功生成证书, 你的网站还是无法访问https. 但是为了安全, 你还是自己手动改配置吧.

更新acme.sh的方法:

目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步.
升级 acme.sh 到最新版 :
acme.sh --upgrade
如果你不想手动升级, 可以开启自动升级:
acme.sh  --upgrade  --auto-upgrade
之后, acme.sh 就会自动保持更新了.
from https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E
上面说的“绑定域名到你的网站的根目录”,意思就是添加一个虚拟主机,下面以nginx webserver为例:
server {
       listen 80;
       server_name mydomain.com;
       root /var/www/mydomain.com;
       index index.html index.htm index.php;
       location / {
               try_files $uri $uri/ =404;
       }
}

修改nginx的配置文件,添加如上的server段代码,然后重启nginx.然后运行:
./acme.sh --issue -d mydomain.com --webroot /var/www/mydomain.com/
会显示:
...
[Thu Jan 24 10:48:59 CST 2019] Your cert is in  /root/.acme.sh/mydomain.com/mydomain.com.cer 
[Thu Jan 24 10:48:59 CST 2019] Your cert key is in  /root/.acme.sh/mydomain.com/mydomain.com.key 
[Thu Jan 24 10:49:00 CST 2019] The intermediate CA cert is in  /root/.acme.sh/mydomain.com/ca.cer 
[Thu Jan 24 10:49:00 CST 2019] And the full chain certs is there:  /root/.acme.sh/mydomain.com/fullchain.cer 
成功生成了证书文件和key文件.一般人到此可以不用往下看了.
(这次我们使用let’s encrypt给网站进行加密。

下载脚本

使用第三方的脚本可以更方便的配置openssl和生成crt证书。

  1. wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.conf
  2. wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.sh
  3. chmod +x letsencrypt.sh

配置脚本

然后需要配置下使用letsencrypt的域名,修改letsencrypt.conf文件。
其中DOMAIN_KEY改成域名.keyDOMANI_DIR是网站的路径。其余的相应也改下。

  1. # only modify the values, key files will be generated automaticly.
  2. ACCOUNT_KEY="letsencrypt-account.key"
  3. DOMAIN_KEY="kswapd.cn.key"
  4. DOMAIN_DIR="/home/www/default"
  5. DOMAINS="DNS:kswapd.cn,DNS:www.kswapd.cn"
  6. #ECC=TRUE
  7. #LIGHTTPD=TRUE

执行脚本

  1. ./letsencrypt.sh ./letsencrypt.conf

结果如下,说明配置正确。

  1. Verifying kswapd.cn...
  2. kswapd.cn verified!
  3. Verifying www.kswapd.cn...
  4. www.kswapd.cn verified!
  5. Signing certificate...
  6. Certificate signed!
  7. New cert: kswapd.chained.crt has been generated

然后在当前执行脚本的目录会生成下面的文件。

主要是一些crt证书和key文件,下面修改nginx配置会用到这些文件。

nginx 配置

上面的脚本执行正确才能配置nginx,否则无效的证书会导致nginx无法正常运行。

其中rewrite ^(.*)$ https://$host$1 permanent;是强制全站使用HTTPS的意思,如果仍然有HTTP请求,那么会301要求浏览器跳转到HTTPS相关的路径。

  1. # Http的配置
  2. server{
  3. listen 80 default_server;
  4. #listen [::]:80 default_server ipv6only=on;
  5. server_name _;
  6. index index.html index.htm index.php;
  7. root /home/www/default;
  8. # 使用Https
  9. rewrite ^(.*)$ https://$host$1 permanent;
  10. }
  11. # https的配置
  12. server{
  13. # Https nginx alias
  14. listen 443 ssl;
  15. ssl_certificate
  16. 路径.域名.chained.crt;
  17. ssl_certificate_key
  18. 路径.域名.key;
  19. server_name _;
  20. index index.html index.htm index.php;
  21. root /home/wwwroot/default;
  22. }

证书自动续签

letsencrypt的Https证书只有90天,但是我们可以无限续签,这里使用crontab创建一个定时任务,定期去请求最新的证书,防止证书过期。
创建一个文件auto_renew并写入下面的内容。

  1. # 每月一日续签证书
  2. 0 0 1 * * /root/lets_encrypt/letsencrypt.sh /root/lets_encrypt/letsencrypt.conf >> /var/log/lets-encrypt.log 2>&1

将任务提交到crontab。

  1. # 提交任务
  2. crontab auto_renew
  3. # 查看crontab中的任务
  4. crontab -l
)
(还可参考:“Linux 下使用 acme.sh 配置 Let's Encrypt 免费 SSL 证书 + 通配符证书”,
http://archive.is/y3EBD)
这里acme.sh 提供了一个添加DNS API自动验证域名的方式,首先到你的域名DNS处获得API,这里我以NS1 DNS域名解析来作为演示,首先到官网后台获得API(其它的DNS,如DNSPOD、Cloudxns、阿里云DNS等使用API的方法见本文第四部分)。

letsencrypt免费SSL证书获得API

然后是导入NS1.com API

export NS1_Key="fdmlfxxxxxxxfk"
现在就可以开始签发SSL证书了:

acme.sh --issue --dns dns_nsone -d mydomain.com -d www.mydomain.com
#或者签发ECC证书
acme.sh --issue --dns dns_nsone -d mydomain.com -d www.mydomain.com --keylength ec-256
letsencrypt免费SSL证书签发成功.

使用DNS API验证域名的方式有一个好处就是不需要WEB访问就可以签发SSL证书,acme.sh 会在你的DNS域名解析处添加一个TXT记录,验证成功后会自动删除该TXT记录。

三、第三步:安装letsencrypt SSL证书
这一步部分其实可以根据各自的实际来执行了,为了让acme.sh 可以自动更新续期SSL证书,建议使用以下操作方法来执行,这样acme.sh 每次更新完了SSL证书后都自动按照你第一次安装SSL证书的方法执行一遍同步SSL证书的命令。

Apache 服务器安装letsencrypt SSL证书如下::

acme.sh --install-cert -d mydomain.com \
--cert-file      /path/to/certfile/in/apache/cert.pem  \
--key-file       /path/to/keyfile/in/apache/key.pem  \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd     "service apache2 force-reload"
Nginx 服务器安装letsencrypt SSL证书e:

acme.sh --install-cert -d mydomain.com \
--key-file       /path/to/keyfile/in/nginx/key.pem  \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd     "service nginx force-reload"
实际操作中,大家根据需要调整好证书和密钥的路径,由于我使用的ECC证书,并且重启Apache2的命令无效,所以我用的以下命令:

acme.sh --install-cert -d ping.mydomain.com --ecc \
--cert-file     /etc/pki/tls/certs/ping.mydomain.com.cer  \
--key-file       /etc/pki/tls/certs/ping.mydomain.com.key  \
--fullchain-file /etc/pki/tls/certs/fullchain.cer \
--reloadcmd     "/etc/init.d/httpd force-reload"
letsencrypt免费SSL证书安装成功

执行命令后,我们就可以在路径中看到已经复制过来的证书还有Key等文件了,下次acme.sh 执行更新SSL证书时也会同样执行上述的命令。否则,需要自己手动复制粘贴证书。

最后记得到Apache或者Nginx的配置中调整好证书和Key的路径,重启Apache或者Nginx就算完成了。

如果你发现letsencrypt SSL证书不能定时更新,你也可以自己手动强制更新:
acme.sh --renew -d example.com --force
如果是ECC cert,使用以下命令:
acme.sh --renew -d example.com --force --ecc

letsencrypt免费SSL证书使用

四、附录:各大DNS API获取与签发SSL
说明:

附录参考自:https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md ,
签发泛域名SSL时请把命令部分:-d www.example.com 改成 :-d *.example.com

4.1  CloudFlare DNS API

First you need to login to your CloudFlare account to get your API key.

export CF_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export CF_Email="xxxx@sss.com"
Ok, let’s issue a cert now:

acme.sh --issue --dns dns_cf -d example.com -d www.example.com
The CF_Key and CF_Email will be saved in ~/.acme.sh/account.conf and will be reused when needed.

4.2  DNSPod DNS API

First you need to login to your DNSPod account to get your API Key and ID.

export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
Ok, let’s issue a cert now:

acme.sh --issue --dns dns_dp -d example.com -d www.example.com
The DP_Id and DP_Key will be saved in ~/.acme.sh/account.conf and will be reused when needed.

4.3  CloudXNS DNS API

First you need to login to your CloudXNS account to get your API Key and Secret.

export CX_Key="1234"
export CX_Secret="sADDsdasdgdsf"
Ok, let’s issue a cert now:

acme.sh --issue --dns dns_cx -d example.com -d www.example.com
The CX_Key and CX_Secret will be saved in ~/.acme.sh/account.conf and will be reused when needed.

4.4  阿里云Aliyun DNS API

First you need to login to your 阿里云 Aliyun account to get your API key. https://ak-console.aliyun.com/#/accesskey

export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
Ok, let’s issue a cert now:

acme.sh --issue --dns dns_ali -d example.com -d www.example.com
The Ali_Key and Ali_Secret will be saved in ~/.acme.sh/account.conf and will be reused when needed.

4.5  GoDaddy DNS API

First you need to login to your GoDaddy account to get your API Key and Secret. https://developer.godaddy.com/keys/

Please create a Production key, instead of a Test key.

export GD_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export GD_Secret="asdfsdafdsfdsfdsfdsfdsafd"
Ok, let’s issue a cert now:

acme.sh --issue --dns dns_gd -d example.com -d www.example.com
The GD_Key and GD_Secret will be saved in ~/.acme.sh/account.conf and will be reused when needed.

4.6  PowerDNS DNS API

First you need to login to your PowerDNS account to enable the API and set your API-Token in the configuration. https://doc.powerdns.com/md/httpapi/README/

export PDNS_Url="http://ns.example.com:8081"
export PDNS_ServerId="localhost"
export PDNS_Token="0123456789ABCDEF"
export PDNS_Ttl=60
Ok, let’s issue a cert now:

acme.sh --issue --dns dns_pdns -d example.com -d www.example.com
The PDNS_Url, PDNS_ServerId, PDNS_Token and PDNS_Ttl will be saved in ~/.acme.sh/account.confand will be reused when needed.

4.7  Amazon Route53 DNS API

方法见:https://github.com/Neilpang/acme.sh/wiki/How-to-use-Amazon-Route53-API

export  AWS_ACCESS_KEY_ID=XXXXXXXXXX
export  AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXX
To issue a cert:

acme.sh --issue --dns dns_aws -d example.com -d www.example.com
The AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY will be saved in ~/.acme.sh/account.conf and will be reused when needed.

4.8  Linode DNS API

First you need to login to your Linode account to get your API Key. https://manager.linode.com/profile/api

Then add an API key with label ACME and copy the new key.

export LINODE_API_KEY="..."
Due to the reload time of any changes in the DNS records, we have to use the dnssleep option to wait at least 15 minutes for the changes to take effect.

Ok, let’s issue a cert now:

acme.sh --issue --dns dns_linode --dnssleep 900 -d example.com -d www.example.com
The LINODE_API_KEY will be saved in ~/.acme.sh/account.conf and will be reused when needed.

4.9  DigitalOcean DNS API (native)

You need to obtain a read and write capable API key from your DigitalOcean account. See: https://www.digitalocean.com/help/api/

export DO_API_KEY="75310dc4ca779ac39a19f6355db573b49ce92ae126553ebd61ac3a3ae34834cc"
Ok, let’s issue a cert now:

acme.sh --issue --dns dns_dgon -d example.com -d www.example.com

4.10 Namesilo DNS API

You’ll need to generate an API key at https://www.namesilo.com/account_api.php Optionally you may restrict the access to an IP range there.

export Namesilo_Key="xxxxxxxxxxxxxxxxxxxxxxxx"
And now you can issue certs with:

acme.sh --issue --dns dns_namesilo --dnssleep 900 -d example.com -d www.example.com

4.11  使用自定义API

If your API is not supported yet, you can write your own DNS API.

Let’s assume you want to name it ‘myapi’:

Create a bash script named ~/.acme.sh/dns_myapi.sh,
In the script you must have a function named dns_myapi_add() which will be called by acme.sh to add the DNS records.
Then you can use your API to issue cert like this:
acme.sh --issue --dns dns_myapi -d example.com -d www.example.com

五、总结
letsencrypt免费SSL证书申请与安装过程还是挺简单的,只需要一个VPS主机,不管有没有安装Web环境都可以签发SSL证书,个人觉得DNS验证方式还是很方便的。

from https://wzfou.com/letsencrypt/
------------

通配符证书的续期


通配符证书需要向域名服务商添加一个txt记录,其实用前面文章中的certbot renew也是可以的,只是要指定更新域名服务商txt记录的shell脚本,该脚本需要调用域名服务商提供的接口,如果你熟悉shell,完全可以自己写,如果你不想麻烦,已经有人帮写好了一个工具:acme.sh

配置步骤

再简单说一下配置步骤:
  • 1.获取https证书(即ssl证书,前面说了,http是用ssl或tls来加密数据包的,所以我们要选获取ssl证书)
  • 2.在http服务器(如nginx、apache等)中配置使用ssl证书
  • 3.过期前自动更新证书(证书是有时效的,比如letsencrypt的证书有效期是90天)

http证书的类型

https证书有指定域名的证书和通配符证书,指定域名如:mydomain.comwww.mydomain.com就是指定域名,而*.mydomain.com即为通配符证书。通配符证书的好处,就在于,如果你后面又增加了几个网站子域名,比如aaa.mydomain.combbb.mydomain.com,你就可以直接用通配符证书,否则你每增加一个子域名,就要申请一次证书,特别麻烦。
既然通配符证书简单,是不是只申请通配符证书就行了呢?是的,但要注意通配符证书是不包括自解析的,比如本博客的域名为mydomain.comwww.mydomain.com,有www的,可以用*.mydomain.com通配符证书,但没有www的是无法使用通配符证书的,因为即使*是空,那也只能匹配.mydomain.com,最前面多了一个点,所以无法匹配。
所以我们需要给通配符证书同时设置两个域名(一个证书是可以设置多个域名的),一个当然就是通配域名*.mydomain.com,另一个就是不包括在通配域名中的mydomain.com

获取https证书的方法

获取数字证书一般都是用ACME(Automatic Certificate Management Environment )自动证书管理环境工具来获取,这样的工具有多种,比如:
certbot, certbot-auto, acme.sh, certbot-letencrypt-wildcardcertificates-alydns-au
鉴于大部分情况下都需要使用通配符证书,所以前面两个并不合适(无法自动更新通配符证书),如果是阿里云买的域名或国外买的域名,可以用第三个acme.sh,最后一个可用于阿里、腾讯云、GoDaddy的域名,因为我的是阿里云买的域名,我这里使用第三个,即acme.sh(后面两个工具都是国人写的)。

安装ssl证书获取工具(acme.sh)

安装acme.sh(使用root权限):
curl https://get.acme.sh | sh
Bash
安装.acme.sh会自动安装到~/.acme.sh目录中(注意它是一个目录,不是单个文件),也就是说,如果你是用root用户安装,那么会安装到/root/.acme.sh目录中,如果是用普通用户,比如你的用户名是zhangsan,那么它将会被安装到/home/zhangsan/.acme.sh目录中。
安装中出现的这三句红色的提示不用管它:
[2019年 02月 15日 星期五 01:04:08 CST] It is recommended to install socat first.
[2019年 02月 15日 星期五 01:04:08 CST] We use socat for standalone server if you use standalone mode.
[2019年 02月 15日 星期五 01:04:08 CST] If you don't use standalone mode, just ignore this warning.
安装完它会自动在.bashrc.zshrc的最后添加以下命令(这是添加环境变量,这样你就可以直接使用acme.sh命令了):
. "/home/xiebruce/.acme.sh/acme.sh.env"
Bash
你只要source一下就可以使用了,如果你用的是bash:
source ~/.bashrc
Bash
如果你使用的是zsh:
source ~/.zshrc
Bash
source之后,试一下(如果正常,则会出来帮助选项):
acme.sh -h
Bash

获取通配符证书

阿里云中获取证书:
先从阿里云中获取“AccessKey ID”和“Access Key Secret”:https://ak-console.aliyun.com/#/accesskey
在你的~/.bashrc.zshrc文件中添加阿里云的“AccessKey ID”和“Access Key Secret”(添加后source一下,跟前面一样,不再赘述):
export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
Bash
然后获取*.mydomain.com的通配符证书,注意要加上mydomain.com,而且要它放第一个(否则生成的证书目录名会被命名成有*号的那个,目录名有*号不太好),因为它是无法匹配通配符证书的:
acme.sh --issue --dns dns_ali -d mydomain.com -d '*.mydomain.com'
Bash
另外,它会等待120秒,原因是要等阿里云的txt记录解析生效,其实不需要这么久,不过为了保证成功率,还是等久一点好。
从CloudFlare获取证书:
点击CloudFlare的右上角头像→点击下拉菜单中的My Profile,滚到差不多到底部,你就可以看到一个“Global API Key”和一个“Origin CA Key”,“Global API Key”就是我们要的Key.
在你的~/.bashrc.zshrc文件中添加CloudFlare的这两个变量:
export CF_Email=example@gmail.com
export CF_Key=85302dsiorw3oisjdkf899234sdf72dfdb46
Bash
然后命令是一样的,只不过--dns指定的api为dns_cf(查看~/.acme.sh/dnsapi/目录,里面有所有支持的api):
acme.sh --issue --dns dns_cf -d mydomain.com -d '*.mydomain.com'
Bash
至于为什么阿里云要的是Ali_KeyAli_Secret,而CloudFlare要的是CF_EmailCF_Key?查看~/.acme.sh/dnsapi/下的api文件,打开对应的文件,比如阿里的就是dns_ali.sh,CloudFlare的就是dns_cf.sh,打开文件自然能看到里面需要什么变量。

安装证书

上边的获取证书,是放到了~/.acme.sh目录中的(实际上是在该目录中生成了一个mydomain.com文件夹,文件夹里就是获取到的证书):
理论上我们在nginx中引用它即可,实际上也可以,但最好不要直接引用它,而是先把它拷贝到另一个目录中比如nginx要用就拷贝到nginx目录中,或者你喜欢放在/etc下或/usr/local/etc下也行,我是放到了nginx的目录中,但不需要自己手动拷贝,直接用以下命令:
acme.sh --install-cert -d 'mydomain.com' \
--key-file       /usr/local/openresty/nginx/letsencrypt/private.pem  \
--fullchain-file /usr/local/openresty/nginx/letsencrypt/fullchain.pem \
--reloadcmd     "nginx -s reload"
Bash
解析:
--install-cert:表示安装证书,其实就是把证书文件拷贝到指定目录。
-d:指定拷贝哪个域名的证书,不过由于我们获取的时候,写了两个域名,一个是mydomain.com,一个是通配*.mydomain.com,写哪个好呢?就写mydomain.com,因为生成的文件夹名字是mydomain.com
--key-file:指定证书私钥(本例是mydomain.com.key文件)的目标路径(即指定要拷到哪里,从哪里拷不用指定,因为肯定是在acme.sh的工作目录中,该工具会自动去找的)。
--fullchain-file:fullchain是所有证书文件,该选项指定拷贝fullchain.cer文件到哪里。
--reloadcmd:重载的命令,因为证书改变后,nginx如果不重新加载配置,新证书是不会生效的。
注意:要保证--key-file--fullchain-file指向的目录存在,如果不存在,则要先创建,否则拷贝失败,比如我是用的openresty所以我放在以下目录,你自己的可以看情况,你自己喜欢放哪就放哪:
mkdir /usr/local/openresty/nginx/letsencrypt
Bash

自动续订(renew)

把以下命令加入到定时任务中即可实现证书过期时自动续订证书(事实上安装的时候已已经自动帮你加了,所以你不用手动加了):
0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" >> /var/log/acme.sh-auto-renew.log
解析:
0 0 * * *:表示每天的0点执行一次。
/root/.acme.sh/acme.sh --cron:其实就是acme.sh --cron,只不过在定时任务中要把acme.sh的绝对路径写出来,该命令会把你所有的证书都renew一遍,并且会自动install并reload nginx,也就是说,renew获取到新证书后,它会自动执行前面的安装命令最后会执行reloadcmd指定的重载nginx的命令。有人可能会有疑问,这样是不是nginx每天都会重载一次?不会的,你单独执行一下acme.sh --cron命令看看结果:
[2019年 02月 15日 星期五 00:40:43 CST] ===Starting cron===
[2019年 02月 15日 星期五 00:40:43 CST] Renew: 'mydomain.com'
[2019年 02月 15日 星期五 00:40:43 CST] Skip, Next renewal time is: 2019年 04月 15日 星期一 15:45:22 UTC
[2019年 02月 15日 星期五 00:40:43 CST] Add '--force' to force to renew.
[2019年 02月 15日 星期五 00:40:43 CST] Skipped mydomain.com
[2019年 02月 15日 星期五 00:40:43 CST] ===End cron===
看到其中的“Skip, Next renewal time is”了吗?没有到续订日期,它会跳过,而且还给出下次续订的日期,所以只有到了续订日期,才会真正续订并reload nginx,否则相当于没有执行。
--home "/root/.acme.sh":这个是指定acme.sh的工具目录,其实不指定应该也是可以的。
>> /var/log/acme.sh-auto-renew.log把前面命令执行输出的结果存到指定的日期文件中。

多台机同一个网站问题

一般情况下都会在负载均衡那台机做一个就够了,不需要每台机都做,如果要多台机做,那就用一台机来更新,然后同步到其他机器。
-----------------

获取通配符证书


这一步不是必须的,这是用通配符的方法配置https证书,有些童鞋可能需要匹配通配符证书,而不是每个域名都要自己手动写,特别要注意的是,通配符证书无法匹配无www的域名解析,比如我的博客域名,有www的是www.mydomain.com,无www的是mydomain.com,那么通配符解析*.mydomain.com只能解析有www的,这很好理解,因为就算*可以为空,但后面还有个点呀,.mydomain.commydomain.com还是无法匹配的,并且这个点是不能去掉的,也就是通配符你不可以写成*mydomain.com
下面开始配置通配符证书,在配置之前,请先打开你的添加域名解析记录的窗口,比如我是阿里云的域名,我就在阿里云里打开准备添加解析记录的窗口,并且记录类型选TXT,注意是TXT,不是A.
然后执行以下命令:
certbot certonly  -d '*.mydomain.com' --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory
特别注意!到了Please deploy a DNS TXT record under the name这一步,不要直接按回车,前面不是打开了添加解析记录的窗口吗?现在你要做的就是把下图显示的这个域名和记录值填到那里,然后点确定添加这条解析记录.
txt的值写为:_acme-challenge
记录类型:TXT
主机记录_acme-challenge.mydomain.com,这是我的域名,你的域名肯定不一样,但前面的『_acme-challenge』这个应该是一样的.
记录值:这个填给出的记录值即可.
现在你可以回到刚才用certbot申请通配符证书那里按回车了,按回车后,正常的话,数字证书和私钥路径会显示出来,还是像前面那样,把它粘到你的nginx的ssl配置对应的ssl_certificate和ssl_certificate_key里面:修改nginx配置文件 然后sudo nginx -s reload即可。
----------------------------
 

Let's Encrypt已正式支持泛域名证书

前言

此前Let’s Encrypt团队宣布将提供泛域名证书支持并于今年初开启了测试,经过几个月的测试(期间还跳票一次),众人翘首以盼的“LE野卡”于昨天(2018.03.14)终于正式面向公众开放了。我也在第一时间申请了一张,以下是过程记录:

准备工作

Let’s Encrypt的证书使用一个自动程序Certbot来完成申请验证发放等功能,但目前官网版本还未更新
因此我们从GitHub克隆一份最新开发版到本地:

cd ~
mkdir src && cd $_
git clone https://github.com/certbot/certbot.git

这条命令将在家目录~创建一个目录src并进入,然后克隆仓库certbot/certbot到本地

正式申请

泛域证书使用了ACMEv2,因此要通过参数手动指定API地址,执行命令:

cd certbot
./certbot-auto --server https://acme-v02.api.letsencrypt.org/directory -d imjad.cn -d *.imjad.cn --manual --preferred-challenges dns-01 certonly


这里使用了手动配置的方式,-d参数用于指定要申请的域名,一般须根域名和泛域名两个
在这里是imjad.cn*.imjad.cn

执行后会先后要求提供邮箱地址、同意协议、同意公开服务器IP等
按要求填写和同意后,程序会要求解析增加一条TXT记录,按要求配置,回车进行验证.
如一切正常,验证通过后证书就应发放成功了.

接下来只需配置Web Server

Nginx配置

泛域名证书与普通证书配置并无不同,甚至还更简单(多个Server块只需一套配置),这里放一个示例:

server {
        listen 443 ssl http2;
        server_name imjad.cn;
        root  /path/to/imjad.cn;
        index index.php index.html index.htm;
        ssl on;
        ssl_certificate      /etc/letsencrypt/live/imjad.cn-0001/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/imjad.cn-0001/privkey.pem;
        ssl_dhparam /etc/ssl/dhparams.pem;
        ssl_session_cache shared:SSL:9m;
        ssl_session_cache shared:ssl_session_cache:10m;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128
-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-R
SA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:D
HE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
        ssl_stapling on;
        ssl_stapling_verify on;

        location ~ .*\.php$
        {
            fastcgi_pass  unix:/tmp/php-cgi-imjad.cn.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
}

配置完成后,执行sudo nginx -s reload重载Nginx配置。

刷新网页,应该就能看到新的证书了。

小结

泛域名证书相对单域名或多域名证书带来的好处是显而易见的。有再多子域名也不必担心,极大方便了配置。
感谢Let’s Encrypt项目和团队,他们对互联网安全的贡献必将载入互联网发展史册。

---------------------------------

用Certbot 申请泛域名证书

Certbot 已经可以完美地通过 pip 安装,申请证书的流程也得到了简化。

申请泛域名证书仍然要求验证你对域名的所有权,因此除了 Certbot,还需要安装对应的插件。本站的 DNS 托管服务商是 Cloudflare,本文也以 Cloudflare 为例。

首先,需要创建一个 Cloudflare 的 API 令牌,权限设置如下图所示:


创建成功后,获得的 API 令牌需要妥善保存。随后,登录到申请 SSL 证书的服务器上,用 pip 安装 Certbot 和 certbot-dns-cloudflare 插件:

pip3 install certbot certbot-dns-cloudflare

然后执行以下命令,将 TOKEN 替换为此前获得的 API 令牌。

echo "dns_cloudflare_api_token=TOKEN" > /etc/cloudflare.ini
chmod 0600 /etc/cloudflare.ini

完成后,直接用 Certbot 申请证书即可。将 example.com 替换为你的邮箱和域名。

certbot certonly --email alex@example.com --dns-cloudflare --dns-cloudflare-credentials /etc/cloudflare.ini -d example.com,*.example.com

--------------------------------------------------

Automatically obtain certs from Let's Encrypt.

certbot-go

Automatically obtain certs from Let's Encrypt.

Only support dns-01 challenge.

Only support Cloudflare's API v4 to deploy TXT record.

Only support EC PRIVATE KEY.

Usage

Usage of certbot-go:
  -csr string
    	path to CSR file
  -mod_cf
    	using Cloudflare's API to deploy TXT record
  -out_ca_bundle string
    	path to ca_bundle output (default "ca_bundle.crt")
  -out_cert string
    	path to certificate output (default "certificate.crt")
  -out_csr string
    	path to csr output if not have own CSR (default "csr.pem")
  -out_fullchain string
    	path to fullchain output (default "fullchain.crt")
  -out_priv_key string
    	path to private key output if EC PRIVATE KEY has not specified (default "private.key")
  -priv_key string
    	path to private key file

Using Cloudflare's API

certbot-go -mod_cf example.com

Must set environments CF_API_KEY (for Cloudflare's API key) and CF_API_EMAIL.

Note: Cannot use Cloudflare's API for domains with a .cf, .ga, .gq, .ml, or .tk TLD (top-level domain).

See: https://api.cloudflare.com/

Manual deploy TXT record, private key would be generated

certbot-go example.com

Have own private key

certbot-go -priv_key secp256r1.key example.com

Have own CSR

certbot-go -csr csr.pem example.com 
from https://github.com/iikira/certbot-go 
(安装方法:go install github.com/iikira/certbot-go@latest)  

 

 

 

 

 

 

 
-------------------------------
相关帖子:
https://briteming.blogspot.com/2016/12/acmeshlets-encryptssl.html
https://briteming.blogspot.com/2017/06/lets-encryptsslcertbot.html
https://briteming.blogspot.com/2019/01/lets-encrypt.html,获取免费的Let’s Encrypt的泛域名野卡证书