Let’s Encrypt 通配符证书(Wildcard Certificates)申请

等了好久好久,今天终于见到你了。

首先你可以查看下官方提供的支持申请通配符证书的客户端列表:https://letsencrypt.org/docs/client-options/。

这些客户端支持最新的ACME v2接口,而这个接口目前已经正式支持申请通配符证书啦。

这里,我使用acme.sh(https://github.com/Neilpang/acme.sh)这个Client,它是直接在bash下运行,使用非常简单,而且支持大多数DNS服务器的API自动验证!

1、安装acme.sh

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

一句话完成安装,安装过程分为:

1)复制acme.sh的程序文件到当前用户主目录,比如root用户的:~/.acmh.sh目录下

2)创建一个alias:acme.sh=~/.acme.sh/acme.sh

2、装完后,就可以开始申请证书了,这里我用的是阿里云的DNS,所以为了能配合完成自动验证,需要在acme.sh的配置中写入阿里云的密钥信息:

1
2
3
4
5
vim ~/.acmh.sh/account.conf

#添加阿里云密钥,改成自己的
Ali_Key="xxxx"
Ali_Secret="xxxxx"

3、最后,重点来了,通配符证书申请命令(以我自己的域名为例):

1
acme.sh  --issue -d junyao.tech  -d *.junyao.tech  --dns dns_ali

注意,这里–dns参数使用的是dns_ali,告诉acme.sh使用阿里云的DNS接口去自动验证。(好处:全程无干预,不需要暂停web服务器!)

4、查看生成的证书文件,证书默认生成在:~/.acme.sh/junyao.tech下:

5、最后,就是配置Apache、NGINX啦。这里以nginx为例子:

首先我们要把生成的证书文件复制出来,这里我放到/etc/nginx/ssl/目录下,运行下面命令:

1
2
3
4
acme.sh --install-cert -d junyao.tech \
--cert-file /etc/nginx/ssl/junyao.tech-cert.pem \
--key-file /etc/nginx/ssl/junyao.tech-key.pem \
--fullchain-file /etc/nginx/ssl/junyao.tech-fullchain.pem

6.配置Nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {  
listen 80;
listen 443 ssl;
server_name junyao.tech;
#error_page 404 =/404.html;
location / {
root /alidata/www;
index index.html;
}
ssl_certificate /etc/nginx/ssl/junyao.tech/junyao.tech-fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/junyao.tech/junyao.tech-key.pem;

ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
}

最后reload一下 nginx

总结:

这里把几个命令整一起,方便使用。

首先,我这里用的阿里云的解析,所以,需要提前设定阿里云的密钥,方法是:

1
2
3
4
5
vim ~/.acmh.sh/account.conf

#添加阿里云密钥,改成自己的
Ali_Key="xxxx"
Ali_Secret="xxxxx"

保存之后,后面使用这个参数时(–dns dns_ali),就自动读这个信息了。

下面是把申请证书和复制证书放在一个文件(new_https.sh)中执行了,只需要传入参数(申请的域名),完成后,只需要去手动修改下apache的配置即可(nginx同理)

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
if [ ! -n "$1" ] ;then
echo "please input domain"
else
/root/.acme.sh/acme.sh --issue -d $1 -d *.$1 --dns dns_ali
mkdir /etc/nginx/ssl/$1
/root/.acme.sh/acme.sh --install-cert -d $1 \
--cert-file /etc/nginx/ssl/$1/$1-cert.pem \
--key-file /etc/nginx/ssl/$1/$1-key.pem \
--fullchain-file /etc/nginx/ssl/$1/$1-fullchain.pem
fi

使用方法:

1
new_https.sh junyao.tech