一、第一步:一键安装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
--------------------------------------------------
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