Skip to main content

Let's Encrypt证书申请及配置

· 4 min read
Alan

本文主要介绍使用 Let's Encrypt(一个由非营利性组织 互联网安全研究小组(ISRG)提供的免费、自动化和开放的证书颁发机构(CA)) 签发证书及Nginx配置。

签发工具

在线版

acme.sh

这里介绍 acme.sh的使用,中文文档Docker使用

安装

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

安装完成后, 会有一个 ~/.acme.sh 目录,之后所有生成的证书也会放在这个目录下,里面有一个 acme.sh 脚本, 添加以下alia方便使用:

alias acme="/root/.acme.sh/acme.sh" # 假设当前是root用户,如果是其他用需要把 /root 改成当前用户目录

其他简单命令:

acme --version # 查看版本
acme --list # 查看证书列表
acme remove <SAN_Domains> # 删除证书
acme --upgrade --auto-upgrade # 自动更新脚本
acme --upgrade # 手动更新脚本
acme --upgrade --auto-upgrade 0 # 关闭更新脚本
acme.sh --renew -d example.com --force # 默认90天过期,可以强制续签证书

证书申请

申请证书前需要验证域名所有权,有两种方式验证: HTTP 和 DNS

  • HTTP:在网站的根目录下添加一个文件
  • DNS:在域名上添加一条 txt 解析记录

下面介绍DNS方式验证

DNS验证域名所有权

DNS不支持自动续签, 执行以下脚本生成解析记录值,

acme --issue --dns -d mydomain.com --yes-I-know-dns-manual-mode-enough-go-ahead-please

上述命令执行完成后,终端会有关于 acme-challenge.mydomain.com 的txt值输出,然后需要去DNS提供商添加一条TXT记录,记录类型为 TXT,主机记录为 acme-challenge.mydomain.com,记录值从终端里复制。

然后查询记录是否生效:

# 查询域名 txt 记录
nslookup -type=txt _acme-challenge.mydomain.com

生效后执行以下脚本:

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

证书配置

上一小节,生成的证书放在了/root/.acme.sh/mydomain.com目录,因为这是 acme.sh 脚本的内部使用目录,而且目录结构可能会变化,所以我们不能让 Nginx 的配置文件直接读取该目录下的证书文件。

正确的做法就是使用--installcert命令,指定目标位置,然后证书文件会被 copy 到相应的位置。

acme.sh  --installcert -d mydomain.cn \
--key-file /wwwroot/certs/alanwei.net.key\
--fullchain-file /wwwroot/certs/alanwei.net.cer \
--reloadcmd "service nginx force-reload" # 这行命令根据具体情况可以省略

Nginx配置

server {
listen 443 ssl;
server_name blog.alanwei.net;

ssl_certificate /wwwroot/certs/alanwei.net.cer; # 证书文件
ssl_certificate_key /wwwroot/certs/alanwei.net.key; # 私钥文件
ssl_session_timeout 5m; # 会话缓存过期时间
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 开启 SSL 支持
ssl_prefer_server_ciphers on; # 设置协商加密算法时,优先使用服务端的加密套件

#charset koi8-r;
access_log /var/log/nginx/blog.alanwei.net.access.log main;

location / {
proxy_pass http://blog.alanwei.com;
}

error_page 500 502 503 504 /50x.html;

location = /50x.html {
root /usr/share/nginx/html;
}
}

参考文章 Let's Encrypt 证书申请及配置 快速签发 Let's Encrypt 证书指南