Let's Encrypt 泛域名证书申请及配置

这里使用的是Let's Encrypt 泛域名证书,以下为Let's Encrypt 泛域名证书的申请与安装方法。

1.安装acme.sh

这里使用 acme.sh 来安装 Let's Encrypt 证书,详见 https://github.com/Neilpang/acme.sh,可以通过下面的简单命令来安装:

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

在安装时,需要提交安装 curl 和 socat 模块

安装完成以后,会有当前用户的 home 目录下生成 .acme.sh 文件目录

2.生成证书

acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证。这里面使用 dns 来验证域名所有权。

acme.sh  --issue  -d domain.com -d *.domain.com --dns dns_dp

当执行上面命令时会出现如下错误:

It seems that you are using dns manual mode. Read this link first: https://github.com/Neilpang/acme.sh/wiki/dns-manual-mode
通过 https://github.com/Neilpang/acme.sh/wiki/dns-manual-mode 找到发解决办法

acme.sh  --issue  -d domain.com -d *.domain.com --dns dns_dp --yes-I-know-dns-manual-mode-enough-go-ahead-please

这是 acme.sh 会生成相应的解析记录,如下:

这时需要将这些记录添加到域名控制面板中的 txt 记录,解析添加完成并成功解析之后,使用如下命令重新生成:

acme.sh  --renew  -d domain.com -d *.domain.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

第二次使用的是 --renew 而不是 --issue

3.安装证书

上面生成的证书默认放到 .acme.sh/domain 下面,请不要直接使用此目录下的文件,此时需要将生成的证书复制到相应nginx的能访问到的目录中。正确的使用方法是使用 --installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 例如:

acme.sh --installcert  -d domain.com \
 --key-file   /usr/local/nginx/ssl/domain.com/domain.com.key \
 --fullchain-file /usr/local/nginx/ssl/domain.comfullchain.cer \
 --reloadcmd  "service nginx force-reload"

当执行上面命令时会报错,原来是没有 service nginx force-reload 命令,于是将上面命令替换为

acme.sh  --installcert  -d domain.com \
--key-file   /usr/local/nginx/ssl/domain.com/domain.com.key \
--fullchain-file /usr/local/nginx/ssl/domain.com/fullchain.cer \
--reloadcmd  "service nginx stop && service nginx start"

4.证书更新

生成的证书有效期为60天,到期后需要进行更新。不过在安装 acme.sh 时已经在 crontab 中添加了一条计划任务来自己更新证书,所以不需要到期手动去更新,这些都是自动的,如下:

5.配置nginx

生成 ssl 证书后需要配置nginx支持https,在nginx的配置目录中添加一个域名ssl证书配置文件 domain.com_ssl.conf

# /usr/local/nginx/conf/domain.com_ssl.conf

ssl                      on;

ssl_certificate          /usr/local/nginx/ssl/domain.comfullchain.cer;
ssl_certificate_key      /usr/local/nginx/ssl/domain.comgodruoyi.key;

ssl_protocols            TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache        shared:SSL:10m;
ssl_session_timeout      30m;

ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload";
add_header  X-Frame-Options  deny;
add_header  X-Content-Type-Options  nosniff;
add_header x-xss-protection "1; mode=block";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob: https:; connect-src 'self' https:; img-src 'self' data: https: blob:; style-src 'unsafe-inline' https:; font-src https:";

Nginx 的配置 ssl_certificate 使用 fullchain.cer ,而非 .cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。

在相应的域名配置文件中引入上面添加的文件并将今天端口改为 443

#/usr/local/nginx/conf/vhost/domain.com.conf
server{
    listen 80;
    server_name sviping.com www.domain.com;
    rewrite ^/(.*)$ https://www.domain.com/$1 permanent;
}

server{
	...

	listen 443;
	include domain.com_ssl.conf;
	
	...
}

到此,Let's Encrypt 泛域名证书申请与安装与全部完成。

由于之前申请了阿里云的免费ssl证书,所以暂时还是用的阿里云的ssl证书。

点赞