nginx+letsencrypt 免费证书,配置,自动更新

981 阅读2分钟

前言

  • 实验环境是ubuntu 16.04,nginx/1.14.0
  • 实验前提:已经有在nginx.conf里面配置了ssl相关的内容,但是它快过期,或者已经过期了。
  • 实验目的:使用certbot申请letsencrypt的ssl,并可以自动刷新证书,使它不会过期,确保一次配置,省去了以后手动更新ssl的操作
  • 实验域名: test.domain.com

1.安装certbot

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update

2.配置nginx location

目的: 使得letsencrypt可以检查并确认我们正在配置的域名是由我们管理的。

1. 新建一个文件来专门维护这个配置,这里我们用letsencrypt.locations

注意,后缀必须用.locations,否则,如果你的后缀为.conf,当你在server里面include之后,nginx -s reload之后会提示"nginx emerg location directive is not allowed here in".

2. 创建一个目录来存放用来跟letsencrypt通信的文件,后续会用到

mkdir -p /usr/local/etc/nginx/letsencrypt/

这个路径你可以自定义,你可以根据你的需求放在任何地方.但是它开始是没有的,需要我们手动创建

letsencrypt.locations 内容如下:

location /.well-known/acme-challenge/ {
  alias /usr/local/etc/nginx/letsencrypt/;
}

我习惯把nginx的相关的配置放在/etc/nginx/conf.d,假设我们要维护的配置文件为test.domain.com.conf 那么现在的目录结构为:

.
├── acmechallenge.locations
└── test.domain.com.conf

server {
  listen 80;
  listen [::]:80;
  server_name test.domain.com;

  include /usr/local/etc/ningx/acmechallenge.locations;
}

3.生成证书

你需要开启2个terminal

1. 在第一个terminal中

certbot certonly --email yourname@domain.com -d test.domain.com --agree-tos --manual

根据提示Y Y,在这个过程中会输出以下信息

Create a file containing just this data:

aDAMY6722Jb6C12JSAwMFZt42L814EVNIXnL21_Ap0-44YwmTqVA.-s23FIsrYa23e_M-6o3zwagFHyGjfmwsfOsmb2tr-YePnvHSO1KRM
1
And make it available on your web server at this URL:

http://test.domain.com/.well-known/acme-challenge/aDAMY2xvv627Jb6C1JSAwMFSZt42WGL84E2VNIXnL_Ap0GH-Ywm3qVA

2. 在第二个terminal

cd /usr/local/etc/nginx/letsencrypt/ && touch aDAMY2xvv627Jb6C1JSAwMFSZt42WGL84E2VNIXnL_Ap0GH-Ywm3qVA && echo aDAMY6722Jb6C12JSAwMFZt42L814EVNIXnL21_Ap0-44YwmTqVA.-s23FIsrYa23e_M-6o3zwagFHyGjfmwsfOsmb2tr-YePnvHSO1KRM > aDAMY2xvv627Jb6C1JSAwMFSZt42WGL84E2VNIXnL_Ap0GH-Ywm3qVA

3. 切回terminal

按Enter继续,letsencrypt会检查这个路径http://test.domain.com/.well-known/acme-challenge/aDAMY2xvv627Jb6C1JSAwMFSZt42WGL84E2VNIXnL_Ap0GH-Ywm3qVA是否正确,如果没有问题,会生成证书。

证书的默认路径在 /etc/letsencrypt/live/test.domain.com. 一般情况下,我们需要2个文件fullchain.pem和privkey.pem 到这一步,我们就得到了letsencrypt的ssl证书,这个证书的有效期是3个月。

4.在nginx配置ssl

网上有很多现成的这里不再赘述,关键配置为

  ssl_certificate           /etc/letsencrypt/live/test.domain.com/fullchain.pem;
  ssl_certificate_key       /etc/letsencrypt/live/live/test.domain.com/privkey.pem;

更改配置后,nginx -s reload使更改生效.

5.检查SSL是否配置正确

这里可以使用很多免费的网站去检查,我使用的是 www.sslshopper.com/ssl-checker…

6.自动更新证书,确保不会更新,因为证书有效期是3个月,那么,1个月去检查一次就足够了。

使用crontab定时任务

0 0 1 1,3,5,7,9,11 1 certbot renew --quiet
5 0 1 1,3,5,7,9,11 1 service nginx reload

到这里基本的ssl配置算是完成了

参考网站: