2

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

水木酱
398 声望7 粉丝

戒骄戒躁,勿忘初心