前言
- 实验环境是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