Pages

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

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

Let’s Encrypt 免费申请泛域名 SSL 证书教程

本文来源于:技术拉近你我!。
原文标题: Let’s Encrypt 免费申请泛域名 SSL 证书教程
原文链接:http://web.archive.org/web/20240729031201/https://coderschool.cn/2904.html
码字不容易,将心比心,转载请注明出处!

免费申请 Let’s Encrypt 的泛域名证书教程

很早以前就开始使用 Let's Encrypt 免费 ssl 证书,虽然每隔 90 天就要重新申请验证,不过由于其免费而且网上提供了定时任务脚本,每隔90天可以自动续约实现永久使用,所以也是非常方便。很早以前使用的是 dns 验证的方法,有几个子域名,就填写几个子域名,然后通过验证dns进行申请。这样方法比较麻烦, 以后如果重新添加了新的子域名还得重新进行申请验证,比较麻烦。

好在今年三月份 Let's Encrypt 就推出了泛域名证书,不过由于太懒,一直没有去申请,最近重新注册了一个新域名,便用这个域名申请下 Let's Encrypt 的泛域名证书,这里简单的记录下步骤。

该方法使用的是  https://github.com/Neilpang/acme.sh  的脚本。

安装acme.sh

以下命令请在Linux系统执行,root和普通用户均可安装。

1
2
3
4
#安装
curl  https://get.acme.sh | sh
#让alias生效
source ~/.bashrc

安装acme.sh,安装成功后提示界面

设置DNS API

不同域名服务商设置 DNS API 不一样,我的域名在 name.com 服务商上,name.com获取 api 的操作如下:

登录后台:https://www.name.com/account/settings/api

同意协议

同意协议后,输入 Token Name ,然后生成 Token 即可:

输入token name,生成token

获取你的 namecom用户名(是用户名,不是 Token Name) 和 Token ,然后运行如下命令:

1
2
3
export Namecom_Username="testuser"
 
export Namecom_Token="xxxxxxxxxxxxxxxxxxxx"

接着运行如下命令:

1
acme.sh --issue --dns dns_namecom -d example.com -d www.example.com

注意:其中的 example.com 改为你自己的域名。因为我们要申请泛域名,所以 www 改为 * 即可,比如我的如下:

acme.sh –issue –dns dns_namecom -d 9xxx89.xyz -d *.9xxx89.xyz

输入token验证信息

进行dns api 验证,申请泛域名证书

如果你是阿里云、腾讯云、或者其他域名服务商,更多的 DNS API 设置方法参考这篇文章:

https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md

上面的文章列举了 53 个常见域名服务商设置 DNS API 的方法,请根据你的域名服务商详细对照着修改,虽然是英文,不过细心查看,操作起来非常容易。

复制证书

然后复制证书,默认生成的证书都放在安装目录下: ~/.acme.sh/,但是官方文档不建议直接使用该目录下的证书,因为这里面的文件都内部使用,而且可能会引起目录结构的变化。正确的使用方法是使用 –installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 如下:

acme.sh  –installcert  -d  <domain>.com   \
–key-file   /etc/nginx/ssl/<domain>.key \
–fullchain-file /etc/nginx/ssl/fullchain.cer \
–reloadcmd  "service nginx force-reload"

比如我的:

acme.sh  –installcert  -d  9xxx89.xyz  \
–key-file   /usr/local/nginx/ssl/ 9xxx89.xyz.key \
–fullchain-file /usr/local/nginx/ssl/fullchain.cer \
–reloadcmd  "service nginx force-reload"

注意,上面的命令 service nginx force-reload 是强制重启 nginx 的操作,可能会报错,报错直接略过,你直接手动修改 nginx 的配置文件,然后重新启动 nginx 即可。

然后修改nginx配置文件,这里附上一份参考,nginx默认的 https 配置,只修改了  ssl_certificate 和  ssl_certificate_key,你可以根据你自己的实际情况重新编辑修改 :

server {
        listen       443 ssl;
        server_name  localhost;

        ssl_certificate      /usr/local/nginx/ssl/fullchain.cer;
        ssl_certificate_key /usr/local/nginx/ssl/978789.xyz.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }

参考文章:

https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E

from  https://web.archive.org/web/20240729031201/https://coderschool.cn/2904.html

很早以前就开始使用 Let's Encrypt 免费 ssl 证书,虽然每隔 90 天就要重新申请验证,不过由于其免费而且网上提供了定时任务脚本,每隔90天可以自动续约实现永久使用,所以也是非常方便。很早以前使用的是 dns 验证的方法,有几个子域名,就填写几个子域名,然后通过验证dns进行申请。这样方法比较麻烦, 以后如果重新添加了新的子域名还得重新进行申请验证,比较麻烦。 好在今年三月份 Let's Encrypt 就推出了泛域名证书,不过由于太懒,一直没有去申请,最近重新注册了一个新域名,便用这个域名申请下 Let's Encrypt 的泛域名证书,这里简单的记录下步骤。 该方法使用的是 https://github.com/Neilpang/acme.sh 的脚本。 安装acme.sh 以下命令请在Linux系统执行,root和普通用户均可安装。 1 2 3 4 #安装 curl https://get.acme.sh | sh #让alias生效 source ~/.bashrc 安装acme.sh,安装成功后提示界面 设置DNS API 不同域名服务商设置 DNS API 不一样,我的域名在 name.com 服务商上,name.com获取 api 的操作如下: 登录后台:https://www.name.com/account/settings/api 同意协议 同意协议后,输入 Token Name ,然后生成 Token 即可: 输入token name,生成token 获取你的 namecom用户名(是用户名,不是 Token Name) 和 Token ,然后运行如下命令: 1 2 3 export Namecom_Username="testuser" export Namecom_Token="xxxxxxxxxxxxxxxxxxxx" 接着运行如下命令: 1 acme.sh --issue --dns dns_namecom -d example.com -d www.example.com 注意:其中的 example.com 改为你自己的域名。因为我们要申请泛域名,所以 www 改为 * 即可,比如我的如下: acme.sh –issue –dns dns_namecom -d 9xxx89.xyz -d *.9xxx89.xyz 输入token验证信息 进行dns api 验证,申请泛域名证书 如果你是阿里云、腾讯云、或者其他域名服务商,更多的 DNS API 设置方法参考这篇文章: https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md 上面的文章列举了 53 个常见域名服务商设置 DNS API 的方法,请根据你的域名服务商详细对照着修改,虽然是英文,不过细心查看,操作起来非常容易。 复制证书 然后复制证书,默认生成的证书都放在安装目录下: ~/.acme.sh/,但是官方文档不建议直接使用该目录下的证书,因为这里面的文件都内部使用,而且可能会引起目录结构的变化。正确的使用方法是使用 –installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 如下: acme.sh –installcert -d .com \ –key-file /etc/nginx/ssl/.key \ –fullchain-file /etc/nginx/ssl/fullchain.cer \ –reloadcmd "service nginx force-reload" 比如我的: acme.sh –installcert -d 9xxx89.xyz \ –key-file /usr/local/nginx/ssl/ 9xxx89.xyz.key \ –fullchain-file /usr/local/nginx/ssl/fullchain.cer \ –reloadcmd "service nginx force-reload" 注意,上面的命令 service nginx force-reload 是强制重启 nginx 的操作,可能会报错,报错直接略过,你直接手动修改 nginx 的配置文件,然后重新启动 nginx 即可。 然后修改nginx配置文件,这里附上一份参考,nginx默认的 https 配置,只修改了 ssl_certificate 和 ssl_certificate_key,你可以根据你自己的实际情况重新编辑修改 : server { listen 443 ssl; server_name localhost; ssl_certificate /usr/local/nginx/ssl/fullchain.cer; ssl_certificate_key /usr/local/nginx/ssl/978789.xyz.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } } 参考文章: https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E

本文来源于:技术拉近你我!。
原文标题: Let’s Encrypt 免费申请泛域名 SSL 证书教程
原文链接:http://web.archive.org/web/20240729031201/https://coderschool.cn/2904.html
码字不容易,将心比心,转载请注明出处!

很早以前就开始使用 Let's Encrypt 免费 ssl 证书,虽然每隔 90 天就要重新申请验证,不过由于其免费而且网上提供了定时任务脚本,每隔90天可以自动续约实现永久使用,所以也是非常方便。很早以前使用的是 dns 验证的方法,有几个子域名,就填写几个子域名,然后通过验证dns进行申请。这样方法比较麻烦, 以后如果重新添加了新的子域名还得重新进行申请验证,比较麻烦。 好在今年三月份 Let's Encrypt 就推出了泛域名证书,不过由于太懒,一直没有去申请,最近重新注册了一个新域名,便用这个域名申请下 Let's Encrypt 的泛域名证书,这里简单的记录下步骤。 该方法使用的是 https://github.com/Neilpang/acme.sh 的脚本。 安装acme.sh 以下命令请在Linux系统执行,root和普通用户均可安装。 1 2 3 4 #安装 curl https://get.acme.sh | sh #让alias生效 source ~/.bashrc 安装acme.sh,安装成功后提示界面 设置DNS API 不同域名服务商设置 DNS API 不一样,我的域名在 name.com 服务商上,name.com获取 api 的操作如下: 登录后台:https://www.name.com/account/settings/api 同意协议 同意协议后,输入 Token Name ,然后生成 Token 即可: 输入token name,生成token 获取你的 namecom用户名(是用户名,不是 Token Name) 和 Token ,然后运行如下命令: 1 2 3 export Namecom_Username="testuser" export Namecom_Token="xxxxxxxxxxxxxxxxxxxx" 接着运行如下命令: 1 acme.sh --issue --dns dns_namecom -d example.com -d www.example.com 注意:其中的 example.com 改为你自己的域名。因为我们要申请泛域名,所以 www 改为 * 即可,比如我的如下: acme.sh –issue –dns dns_namecom -d 9xxx89.xyz -d *.9xxx89.xyz 输入token验证信息 进行dns api 验证,申请泛域名证书 如果你是阿里云、腾讯云、或者其他域名服务商,更多的 DNS API 设置方法参考这篇文章: https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md 上面的文章列举了 53 个常见域名服务商设置 DNS API 的方法,请根据你的域名服务商详细对照着修改,虽然是英文,不过细心查看,操作起来非常容易。 复制证书 然后复制证书,默认生成的证书都放在安装目录下: ~/.acme.sh/,但是官方文档不建议直接使用该目录下的证书,因为这里面的文件都内部使用,而且可能会引起目录结构的变化。正确的使用方法是使用 –installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 如下: acme.sh –installcert -d .com \ –key-file /etc/nginx/ssl/.key \ –fullchain-file /etc/nginx/ssl/fullchain.cer \ –reloadcmd "service nginx force-reload" 比如我的: acme.sh –installcert -d 9xxx89.xyz \ –key-file /usr/local/nginx/ssl/ 9xxx89.xyz.key \ –fullchain-file /usr/local/nginx/ssl/fullchain.cer \ –reloadcmd "service nginx force-reload" 注意,上面的命令 service nginx force-reload 是强制重启 nginx 的操作,可能会报错,报错直接略过,你直接手动修改 nginx 的配置文件,然后重新启动 nginx 即可。 然后修改nginx配置文件,这里附上一份参考,nginx默认的 https 配置,只修改了 ssl_certificate 和 ssl_certificate_key,你可以根据你自己的实际情况重新编辑修改 : server { listen 443 ssl; server_name localhost; ssl_certificate /usr/local/nginx/ssl/fullchain.cer; ssl_certificate_key /usr/local/nginx/ssl/978789.xyz.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } } 参考文章: https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E

本文来源于:技术拉近你我!。
原文标题: Let’s Encrypt 免费申请泛域名 SSL 证书教程
原文链接:http://web.archive.org/web/20240729031201/https://coderschool.cn/2904.html
码字不容易,将心比心,转载请注明出处

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

Certbot申请泛域名证书与续期

安装

因为域名使用了 Cloudflare 的 DNS 解析,证书自动续期时要调用 Cloudflare 的 API,因此需要安装 Cloudflare 官方提供的插件。

使用 pip

如果你系统是使用 APT 包管理器,如 Debian, Ubuntu..

sudo apt update && sudo apt install python3 python3-venv libaugeas0

如果你系统是使用 RPM 包管理器,如 Fedora, CentOS..

sudo dnf install python3 augeas-libs

# 如果是旧系统的话
sudo yum install python3 augeas-libs

设置 python 虚拟环境,这一步非常有必要,这样子就不会破坏原系统上的 python 环境。

sudo python3 -m venv /opt/certbot/

更新虚拟环境上的 pip 包管理器

sudo /opt/certbot/bin/pip install --upgrade pip

安装 certbot 及 cloudflare 插件

sudo /opt/certbot/bin/pip install certbot certbot-dns-cloudflare

如果域名托管在阿里云

sudo /opt/certbot/bin/pip install certbot certbot-dns-aliyun

如果域名托管在腾讯云

sudo /opt/certbot/bin/pip install certbot git+https://github.com/tengattack/certbot-dns-dnspod.git

更多插件相关,可查阅: 

https://eff-certbot.readthedocs.io/en/latest/using.html#dns-plugins

创建链接,让系统可直接使用 certbot 命令

sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot

至此,certbot 及相应的插件便安装完成了。

如要升级,可根据安装的插件来替换以下命令

sudo /opt/certbot/bin/pip install --upgrade certbot certbot-dns-cloudflare

若出现问题,可直接使用 sudo rm -rf /opt/certbot 来删除这个 python 虚拟环境,然后按上述步骤重新安装即可。

使用 snap

本人使用的安装方法,如果你同样使用 Ubuntu 这个系统的话,也可以尝试一下。我使用 snap 的原因有两点,沙盒运行和自动更新。总之,snap 的优缺点非常明显,在此不过多叙说,选择适合自己的。

# 安装 certbot
sudo snap install --classic certbot
# 创建链接
sudo ln -s /snap/bin/certbot /usr/bin/certbot
# 信任插件
sudo snap set certbot trust-plugin-with-root=ok
# 安装插件
sudo snap install certbot-dns-cloudflare

使用 apt (不推荐)

使用 APT 包管理工具来安装 certbot 以及相应插件,并且域名托管在 Cloudflare 的话,必须使用 Cloudflare Global API Key 才能成功申请并自动续期泛域名证书。个人非常不建议这个选择,全局 API 密钥可能会产生安全问题。

sudo apt update && sudo apt install certbot python3-certbot-dns-cloudflare

申请证书

上述介绍了 Certbot 及其插件的三种安装方式,在使用旧版本时,如果使用 Cloudflare 来解析域名的话,需要注意安全问题,接下来继续完成未完成的工作。

创建配置文件

mkdir -p ~/.secrets/certbot && vim ~/.secrets/certbot/cloudflare.ini

添加以下内容

# Cloudflare API token used by Certbot
dns_cloudflare_api_token = 0123456789abcdef0123456789abcdef01234567

注:将内容上的令牌2修改成自己的

若你仍然坚持使用 APT 包管理工具来安装 certbot 及其插件,将 ~/.secrets/certbot/cloudflare.ini 替换成以下内容,使用全局 API 密钥(慎重选择)

dns_cloudflare_email = "Cloudflare Email"
dns_cloudflare_api_key = Global API Key

如果域名托管在阿里云,创建 ~/.secrets/certbot/aliyun.ini 添加以下内容

dns_aliyun_access_key = 12345678
dns_aliyun_access_key_secret = 1234567890abcdef1234567890abcdef

查看阿里云 AccessKey: https://ram.console.aliyun.com/

如果域名托管在腾讯云,将 ~/.secrets/certbot/dnspod.ini 添加以下内容

dns_dnspod_api_id = 12345
dns_dnspod_api_token = 1234567890abcdef1234567890abcdef

查看腾讯云 API Token:https://www.dnspod.cn/console/user/security

设置安全权限

sudo chmod 0400 ~/.secrets/certbot/cloudflare.ini

申请指令

sudo certbot certonly --non-interactive --agree-tos --email i@iamlm.com --dns-cloudflare --dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini --dns-cloudflare-propagation-seconds 30 -d laomai.org,*.laomai.org

注:使用对应的配置文件

申请成功则如下显示

sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini --dns-cloudflare-propagation-seconds 30 -d laomai.org,*.laomai.org

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): i@iamlm.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y
Account registered.
Requesting a certificate for laomai.org and *.laomai.org
Waiting 30 seconds for DNS changes to propagate

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/laomai.org/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/laomai.org/privkey.pem
This certificate expires on 2024-04-12.
These files will be updated when the certificate renews.

NEXT STEPS:
- The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions.
We were unable to subscribe you the EFF mailing list because your e-mail address appears to be invalid. You can try again later by visiting https://act.eff.org.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

配置证书

以 Nginx 为例,添加以下内容到相应站点的 Nginx 配置文件上。如:/etc/nginx/conf.d/laomai.org.conf

listen 443 ssl;
	ssl_certificate /etc/letsencrypt/live/laomai.org/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/laomai.org/privkey.pem;

测试 Nginx

sudo nginx -t

返回以下内容则表示配置正确

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重启 Nginx

sudo nginx -s reload

自动续期

常用方法有两个,Crontab 或 Systemd.timer。

Crontab

查看 certbot 与 nginx 的完整路径

which certbot

which nginx

crontab -e 添加计划

35 19 * * * /usr/bin/certbot renew --quiet --agree-tos --post-hook "/usr/sbin/nginx -s reload" > /dev/null 2>&1

说明:

  • 因服务器时区关系我将触发时间设置成 35 19 * * *
  • --quiet 选项用于抑制 certbot 命令的输出,--post-hook 选项用于在证书续订后执行 /usr/sbin/nginx -s reload 命令来重新加载 Nginx 配置;
  • 如果想保留日志,可以用 >> /etc/letsencrypt/certbot.log 2>&1 替换 > /dev/null 2>&1,建议先行创建用来记录日志的文件,touch /etc/letsencrypt/certbot.log
  • >> /etc/letsencrypt/certbot.log 2>&1 将 certbot 命令的输出和错误消息都追加到 /etc/letsencrypt/certbot.log 日志文件中。如果使用 > 而不是 >>,则每次运行计划时,/etc/letsencrypt/certbot.log 日志文件都会被覆盖,从而导致以前的日志丢失;

Systemd.timer

创建文件:/etc/systemd/system/certbot.service

[Unit]
Description=certbot renew

[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet --agree-tos --post-hook "/usr/sbin/nginx -s reload"

创建文件:/etc/systemd/system/certbot.timer

[Unit]
Description=Automatic renewal certificates

[Timer]
OnCalendar=19:35:00
RandomizedDelaySec=1h
Persistent=true

[Install]
WantedBy=timers.target

启用自动更新:

sudo systemctl enable --now certbot.timer

Systemd 扩展:

# 停止并删除
sudo systemctl stop certbot.timer
sudo systemctl disable certbot.timer
sudo systemctl stop certbot.service
sudo systemctl disable certbot.service
sudo rm /etc/systemd/system/certbot.timer
sudo rm /etc/systemd/system/certbot.service

# 重新读取
sudo systemctl daemon-reload

# 开始
sudo systemctl start certbot.service

# 查看状态与日志
sudo systemctl status certbot.service

journalctl -u certbot

# 查看timer列表
systemctl list-timers

Docker 部署

我个人偏向使用容器化来部署项目,比如说这个博客我就是使用 Nginx Proxy Manager 来进行代理管理,还有 Twikoo 评论,Umami 等等。但是为什么一开始我并没有介绍如何使用 Docker 来部署并申请证书呢?

主要原因有以下两点:

  1. 如果拥抱容器化,那么直接使用 Nginx Proxy Manager 来管理项目就好,Nginx Proxy Manager 提供了很好的证书申请与管理页面,更为直观,而且证书都是自动续期的。
  2. 使用 Docker 部署 Certbot 并申请证书,在设置自动续期上我没有搞懂如何利用勾子来触发宿主机的 Nginx 去重载配置。当然,如果暴力一点,每天运行自动续期命令时都让宿主机上的 Nginx 重载配置也是可行的。

利用 Docker 申请证书

docker run -it --rm --name certbot \
	-v "/root/.secrets/certbot/cloudflare.ini:/opt/certbot/cloudflare.ini" \
	-v "/etc/letsencrypt:/etc/letsencrypt" \
	-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
	-v "/var/log/letsencrypt:/var/log/letsencrypt" \
	certbot/dns-cloudflare certonly --non-interactive --agree-tos --email i@iamlm.com --dns-cloudflare --dns-cloudflare-credentials /opt/certbot/cloudflare.ini --dns-cloudflare-propagation-seconds 30 -d laomai.org,*.laomai.org

利用 Docker 续期证书

docker run -it --rm --name certbot \
	-v "/root/.secrets/certbot/cloudflare.ini:/opt/certbot/cloudflare.ini" \
	-v "/etc/letsencrypt:/etc/letsencrypt" \
	-v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
	-v "/var/log/letsencrypt:/var/log/letsencrypt" \
	certbot/dns-cloudflare renew --non-interactive --agree-tos --email i@iamlm.com --dns-cloudflare --dns-cloudflare-credentials /opt/certbot/cloudflare.ini

添加自动续期计划

35 19 * * * docker run -it --rm --name certbot -v "/root/.secrets/certbot/cloudflare.ini:/opt/certbot/cloudflare.ini" -v "/etc/letsencrypt:/etc/letsencrypt" -v "/var/lib/letsencrypt:/var/lib/letsencrypt" -v "/var/log/letsencrypt:/var/log/letsencrypt" certbot/dns-cloudflare renew --non-interactive --agree-tos --email i@iamlm.com --dns-cloudflare --dns-cloudflare-credentials /opt/certbot/cloudflare.ini; nginx -s reload

最后

之前记录过一次在群晖上使用 acme.sh 来申请证书,与 certbot 相比,acme.sh 更加灵活一点。但是个人感觉 certbot 更加规范一些,当然,它俩的功能都是一样的。就看我们如何去使用了,用 certbot 申请的证书如果想要在面板上使用的话,只需在面板上修改 ssl_certificate 与 ssl_certificate_key 对应的路径即可。

  1. https://github.com/cloudflare/certbot-dns-cloudflare ;

  2. https://developers.cloudflare.com/fundamentals/api/get-started/create-token/

  3. https://developers.cloudflare.com/fundamentals/api/get-started/keys/ 

Footnotehttps://github.com/cloudflare/certbot-dns-cloudflare ; 

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

Let’s Encrypt 免费申请泛域名 SSL 证书教程

本文来源于:技术拉近你我!。
原文标题: Let’s Encrypt 免费申请泛域名 SSL 证书教程
原文链接:http://web.archive.org/web/20240729031201/https://coderschool.cn/2904.html
码字不容易,将心比心,转载请注明出处!

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的泛域名野卡证书