一、第一步:一键安装acme.sh
https://github.com/Neilpang/acme.sh
git clone https://github.com/Neilpang/acme.sh
cd acme.sh
./acme.sh --install
会显示:
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
会显示:
注意:如果等了2分钟,还没有生成证书,说明你的acme.sh的版本太低了,需要升级,方能解决问题。升级的办法:./acme.sh --upgrade
./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/
更新acme.sh的方法:
acme.sh --upgrade
acme.sh --upgrade --auto-upgrade
./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证书。
wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.conf
wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.sh
chmod +x letsencrypt.sh
配置脚本
然后需要配置下使用letsencrypt的域名,修改letsencrypt.conf文件。
其中DOMAIN_KEY
改成域名.key
,DOMANI_DIR
是网站的路径。其余的相应也改下。
# only modify the values, key files will be generated automaticly.
ACCOUNT_KEY="letsencrypt-account.key"
DOMAIN_KEY="kswapd.cn.key"
DOMAIN_DIR="/home/www/default"
DOMAINS="DNS:kswapd.cn,DNS:www.kswapd.cn"
#ECC=TRUE
#LIGHTTPD=TRUE
执行脚本
./letsencrypt.sh ./letsencrypt.conf
结果如下,说明配置正确。
Verifying kswapd.cn...
kswapd.cn verified!
Verifying www.kswapd.cn...
www.kswapd.cn verified!
Signing certificate...
Certificate signed!
New cert: kswapd.chained.crt has been generated
然后在当前执行脚本的目录会生成下面的文件。
主要是一些crt证书和key文件,下面修改nginx配置会用到这些文件。
nginx 配置
上面的脚本执行正确才能配置nginx,否则无效的证书会导致nginx无法正常运行。
其中rewrite ^(.*)$ https://$host$1 permanent;
是强制全站使用HTTPS的意思,如果仍然有HTTP请求,那么会301要求浏览器跳转到HTTPS相关的路径。
# Http的配置
server{
listen 80 default_server;
#listen [::]:80 default_server ipv6only=on;
server_name _;
index index.html index.htm index.php;
root /home/www/default;
# 使用Https
rewrite ^(.*)$ https://$host$1 permanent;
}
# https的配置
server{
# Https nginx alias
listen 443 ssl;
ssl_certificate
路径.域名.chained.crt;
ssl_certificate_key
路径.域名.key;
server_name _;
index index.html index.htm index.php;
root /home/wwwroot/default;
}
证书自动续签
letsencrypt的Https证书只有90天,但是我们可以无限续签,这里使用crontab创建一个定时任务,定期去请求最新的证书,防止证书过期。
创建一个文件auto_renew
并写入下面的内容。
# 每月一日续签证书
0 0 1 * * /root/lets_encrypt/letsencrypt.sh /root/lets_encrypt/letsencrypt.conf >> /var/log/lets-encrypt.log 2>&1
将任务提交到crontab。
# 提交任务
crontab auto_renew
# 查看crontab中的任务
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验证方式还是很方便的。
------------
通配符证书的续期
certbot renew
也是可以的,只是要指定更新域名服务商txt记录的shell脚本,该脚本需要调用域名服务商提供的接口,如果你熟悉shell,完全可以自己写,如果你不想麻烦,已经有人帮写好了一个工具:acme.sh。配置步骤
- 1.获取https证书(即ssl证书,前面说了,http是用ssl或tls来加密数据包的,所以我们要选获取ssl证书)
- 2.在http服务器(如nginx、apache等)中配置使用ssl证书
- 3.过期前自动更新证书(证书是有时效的,比如letsencrypt的证书有效期是90天)
http证书的类型
www.
mydomain.com就是指定域名,而*.
mydomain.com即为通配符证书。通配符证书的好处,就在于,如果你后面又增加了几个网站子域名,比如aaa.
mydomain.com、bbb.
mydomain.com,你就可以直接用通配符证书,否则你每增加一个子域名,就要申请一次证书,特别麻烦。www.
mydomain.com,有www的,可以用*.
mydomain.com通配符证书,但没有www的是无法使用通配符证书的,因为即使*
是空,那也只能匹配.
mydomain.com,最前面多了一个点,所以无法匹配。*.
mydomain.com,另一个就是不包括在通配域名中的mydomain.com。获取https证书的方法
acme.sh
,最后一个可用于阿里、腾讯云、GoDaddy的域名,因为我的是阿里云买的域名,我这里使用第三个,即acme.sh
(后面两个工具都是国人写的)。安装ssl证书获取工具(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
命令了):获取通配符证书
~/.bashrc
或.zshrc
文件中添加阿里云的“AccessKey ID”和“Access Key Secret”(添加后source一下,跟前面一样,不再赘述):*.
mydomain.com的通配符证书,注意要加上mydomain.com,而且要它放第一个(否则生成的证书目录名会被命名成有*号的那个,目录名有*号不太好),因为它是无法匹配通配符证书的:点击CloudFlare的右上角头像→点击下拉菜单中的
My Profile
,滚到差不多到底部,你就可以看到一个“Global API Key”和一个“Origin CA Key”,“Global API Key”就是我们要的Key.~/.bashrc
或.zshrc
文件中添加CloudFlare的这两个变量:--dns
指定的api为dns_cf
(查看~/.acme.sh/dnsapi/
目录,里面有所有支持的api):Ali_Key
和Ali_Secret
,而CloudFlare要的是CF_Email
和CF_Key
?查看~/.acme.sh/dnsapi/
下的api文件,打开对应的文件,比如阿里的就是dns_ali.sh
,CloudFlare的就是dns_cf.sh
,打开文件自然能看到里面需要什么变量。安装证书
~/.acme.sh
目录中的(实际上是在该目录中生成了一个mydomain.com文件夹,文件夹里就是获取到的证书):/etc
下或/usr/local/etc
下也行,我是放到了nginx的目录中,但不需要自己手动拷贝,直接用以下命令:--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所以我放在以下目录,你自己的可以看情况,你自己喜欢放哪就放哪:自动续订(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===
--home "/root/.acme.sh"
:这个是指定acme.sh
的工具目录,其实不指定应该也是可以的。>> /var/log/acme.sh-auto-renew.log
把前面命令执行输出的结果存到指定的日期文件中。多台机同一个网站问题
获取通配符证书
www.mydomain.com
,无www的是mydomain.com,那么通配符解析*.
mydomain.com只能解析有www的,这很好理解,因为就算*可以为空,但后面还有个点呀,.
mydomain.com跟mydomain.com还是无法匹配的,并且这个点是不能去掉的,也就是通配符你不可以写成*
mydomain.comPlease deploy a DNS TXT record under the name
这一步,不要直接按回车,前面不是打开了添加解析记录的窗口吗?现在你要做的就是把下图显示的这个域名和记录值填到那里,然后点确定添加这条解析记录.主机记录:_acme-challenge.mydomain.com,这是我的域名,你的域名肯定不一样,但前面的『_acme-challenge』这个应该是一样的.
记录值:这个填给出的记录值即可.
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
按要求填写和同意后,程序会要求解析增加一条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 |
完成后,直接用 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 证书教程
原文链接: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 |
设置DNS API
不同域名服务商设置 DNS API 不一样,我的域名在 name.com 服务商上,name.com获取 api 的操作如下:
登录后台:https://www.name.com/account/settings/api
同意协议后,输入 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
如果你是阿里云、腾讯云、或者其他域名服务商,更多的 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 证书教程
原文链接:http://web.archive.org/web/20240729031201/https://coderschool.cn/2904.html
码字不容易,将心比心,转载请注明出处!
本文来源于:技术拉近你我!。
原文标题: 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 来部署并申请证书呢?
主要原因有以下两点:
- 如果拥抱容器化,那么直接使用 Nginx Proxy Manager 来管理项目就好,Nginx Proxy Manager 提供了很好的证书申请与管理页面,更为直观,而且证书都是自动续期的。
- 使用 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
对应的路径即可。
https://github.com/cloudflare/certbot-dns-cloudflare ;
https://developers.cloudflare.com/fundamentals/api/get-started/create-token/
https://developers.cloudflare.com/fundamentals/api/get-started/keys/
Footnotehttps://github.com/cloudflare/certbot-dns-cloudflare ;
--------------------------------------------------------------------
本文来源于:技术拉近你我!。
原文标题: 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