# CentOS下自动申请、部署Let's Encrypt免费SSL证书教程（Nginx亲测）

本文介绍如何在 CentOS7 + Nginx 环境下，安装使用 Let's Encrypt 免费 SSL 证书。

* 1.防火墙和安全组放行 80 端口（后续配置 HTTPS 访问再自行放行 443 端口）
* 2.确保域名已经解析到了你在申请证书的服务器 IP 上
* 3.确保 Nginx 配置无误，指：<http://example.com/.well-known/acme-challenge/> 下临时生成的认证文件可以被访问到。

### 1，准备工作

（1）首先安装 Nginx 服务器，并确保正常运行, 临时文件可以访问

```bash
server {
		...

        # Let's Encrypt 证书认证（优先级最高放在最前面）
        location ~ /.well-known {
            root /usr/share/nginx;
            allow all;
        }
}
```

（2）服务器要开放 80 口及 443 端口：

```bash
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload
```

（3）在域名服务器创建一条 A 记录，指向服务器的公网 IP 地址。比如我这里使用 demo.niubi.com 这个域名。等域名解析生效后，访问 <http://demo.niubi.com> 可以看到如下页面则说明域名解析成功：

### 2，安装 certbot 工具

我们采用 certbot 脚本方式申请 let's encript 证书，依次执行如下命令安装该工具：

```bash
yum install -y epel-release
yum install -y certbot
```

### 3，申请证书

（1）接下来我们要使用 certbot 命令初次申请证书，命令格式如下： 注意：联系人 email 地址最好填写真实有效的地址，Let's Encrypt 会在证书在过期以前发送通知提醒邮件。

```bash
certbot certonly --webroot -w [Web站点目录] -d [站点域名] -m [联系人email地址] --agree-tos
```

（2）这里我执行如下命令申请，大家根据实际情况修改：

```bash
certbot certonly --webroot -w /usr/local/nginx/html -d demo.niubi.com -m service@niubi.com --agree-tos
```

（3）申请成功后，证书会保存在 /etc/letsencrypt/live/demo.niubi.com/ 下面：&#x20;

```bash
[root@localhost ~]# ls /etc/letsencrypt/live/demo.niubi.com/
cert.pem  chain.pem  fullchain.pem  privkey.pem  README
```

（5）使用如下命令可以查看证书的有效期：

```bash
openssl x509 -noout -dates -in /etc/letsencrypt/live/demo.niubi.com/cert.pem
```

### 4，更新证书

（1）Let's Encrypt 证书的有效期是 90 天，需要长期使用的话，需要在失效前进行延长申请。我们可以执行如下命令去更新：

```bash
//更新证书
certbot renew --dry-run
 
//如果不需要返回的信息，可以用静默方式
certbot renew --quiet
```

2）我们也可以将更新证书的脚本写到定时任务来自动完成，免得我们手动操作。首先执行如下命令开始编辑定时任务：

```bash
crontab -e
```

（3）此时会进入 vi 的编辑界面让你编辑工作（每项工作都是一行）。我们在末尾添加如下一行内容，表示每月 1 号 5 时会执行执行一次更新，并重启 nginx 服务器：

```bash
00 05 01 * * /usr/bin/certbot renew --quiet && /bin/systemctl restart nginx
```

（4）保存后退出，执行 crontab -l 命令可以查看 crontab 服务是否创建成功：

### 5，配置 Nginx

（1）首先执行如下命令生成 Perfect Forward Security（PFS）键值：

```bash
mkdir /etc/ssl/private/ -p
cd /etc/ssl/private/
openssl dhparam 2048 -out dhparam.pem
```

（2）接着编辑 nginx 配置文件：

```bash
vi /usr/local/nginx/conf/nginx.conf
```

（3）首先修改默认的 server 配置：

```bash
server {
    listen       80;
    server_name  demo.niubi.com;
    rewrite ^ https://$server_name$request_uri? permanent;
}
```

（4）接着将 HTTPS server 配置前面的注释（#）去掉，把内容改成如下：

```bash
# HTTPS server
#
server {
    listen       443 ssl;
    server_name  demo.niubi.com;
 
    ssl_certificate      /etc/letsencrypt/live/demo.niubi.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/demo.niubi.com/privkey.pem;
 
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;
 
    ssl_dhparam /etc/ssl/private/dhparam.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 
    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-RSA-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:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK';
        ssl_prefer_server_ciphers  on;
 
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
```

（5）保存退出后，重启 nginx 服务：

```bash
nginx -s reload
```

（6）再次使用浏览器访问 <http://demo.niubi.com，如果正常跳转到> <https://demo.niubi.com，并且地址栏有个小锁图标则说明> https 配置成功了
