letsencrypt是什么就不作过多的赘述了,它对于咱们的意义在于方便的签发证书、加密、被主流浏览器信任。html
letsencrypt 官网
客户端:certbot 官网nginx
$ 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
$ 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 域名申请了证书。web
--webroot 模式表示:CertBot在验证服务器域名的时候,会在 -w 这个路径生成一个随机文件,并经过http-01方式验证。(更多的其余模式可在官方文档中查看,感受这种模式更加自由点)。shell
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; }
# 定时更新证书 (还未验证效果) sudo crontab -e # 添加: 30 2 * */2 * /usr/bin/certbot renew >> /var/log/le-renew.log # 删除已有的证书(可选择) sudo certbot delete