letsencrypt是什么就不做过多的赘述了,它对于我们的意义在于方便的签发证书、加密、被主流浏览器信任。
letsencrypt 官网
客户端:certbot 官网
1. 安装cerbot(Ubuntu下)
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot
2. 申请证书
$ sudo certbot certonly --webroot -w /usr/share/nginx/html/ -d www.domain1.com -d domain1.com
$ sudo certbot certonly --webroot -w /usr/share/nginx/html/ -d www.domain2.com -d domain2.com
# 成功后的证书可在这查看
$ ls /etc/letsencrypt/live
以上是分别为www.domain1.com,domain1.com,www.domain2.com,domain2.com 域名申请了证书。
--webroot 模式表示:CertBot在验证服务器域名的时候,会在 -w 这个路径生成一个随机文件,并通过http-01方式验证。(更多的其他模式可在官方文档中查看,感觉这种模式更加自由点)。
3. 修改nginx配置文件
server {
listen 443;
ssl on;
server_name domain1.com www.domain1.com;
ssl_certificate /etc/letsencrypt/live/www.domain1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.domain1.com/privkey.pem;
}
重载nginx,然后在浏览器访问 https://www.domain1.com 即可查看效果。
然后,根据业务需求,实现全站https并拦截http请求,nginx配置文件中添加相关重定向:
# http转https
server{
listen 80;
server_name domain1.com www.domain1.com;
#告诉浏览器有效期内只准用 https 访问
add_header Strict-Transport-Security max-age=15768000;
#永久重定向到 https 站点
return 301 https://$host$request_uri;
}
server {
listen 443;
ssl on;
server_name domain1.com www.domain1.com;
ssl_certificate /etc/letsencrypt/live/www.domain1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.domain1.com/privkey.pem;
# 重定向转发给后端程序
location /demo {
proxy_pass http://demo;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# https 对于未匹配的域名的处理(如domain2.com)
server {
listen 443 ssl default_server;
server_name _;
# 虽然不是对应的证书,但得有,否则不能正常访问
ssl_certificate ssl_certificate /etc/letsencrypt/live/www.domain1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.domain1.com/privkey.pem;
return 404;
}
4. 其他
# 定时更新证书 (还未验证效果)
sudo crontab -e
# 添加: 30 2 * */2 * /usr/bin/certbot renew >> /var/log/le-renew.log
# 删除已有的证书(可选择)
sudo certbot delete
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。