如果你的网站还没有https,那么使用certbot是一个不错的选择,它能帮你免费申请到90天的https证书,并且可以无限次的续期。

这款工具迭代到今天已经非常的易用,如果你的服务器安装配置好了NginxApachecertbot会自动识别到配置文件并用傻瓜式的操作引导你完成配置,但如果你的服务器程序是在docker里就比较麻烦了。

如果Nginx是docker部署,那么certbot无法识别到配置文件,如果应用程序是docker部署,则会更加麻烦,certbot需要在网站应用的根目录下放置一个文件,用以验证域名,所以你需要把应用程序的根目录挂载出来,对于一些特殊的应用框架可能还要更改一些静态文件路由配置等。

一个比较好的方法就是做一个专门用来申请证书的Nginx容器,将webroot文件夹挂载出来。

version: "3.0"
services:
  nginx-certbot:
    container_name: nginx-certbot
    image: nginx:latest
    network_mode: host
    volumes:
      - ./conf.d:/etc/nginx/conf.d
      - ./webroot:/var/webroot

以我的配置文件为例,只需让外网能访问到验证文件即可。

server {
        listen 80;
        server_name     sakuradon.com  blog.sakuradon.com;
        location ~ /.well-known/acme-challenge {
                allow all;
                root /var/webroot;
        }
        root /var/webroot;
        index index.html;
}

certbot会用到三个路径work-dir config-dir logs-dir,如果不想用到root权限可以指定路径,最后证书会生成在config-dir下。

certbot certonly --work-dir ./work --config-dir ./letsencrypt --logs-dir ./logs --webroot --webroot-path ./webroot --agree-tos -d ${domain}

证书生成后使用certbot renew命令可以续期,可以写在系统定时任务中。

certbot renew --work-dir ./work --config-dir ./letsencrypt --logs-dir ./logs

最后是Nginx的配置文件,加上ssl_certificatessl_certificate_key两项配置即可。

server {
        listen 443 ssl;
        server_name     blog.sakuradon.com;
......

        ssl_certificate /etc/letsencrypt/live/blog.sakuradon.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/blog.sakuradon.com/privkey.pem;
}


server {
        listen 80;
        server_name     blog.sakuradon.com;
        if ($host = blog.sakuradon.com) {
                return 301 https://$host$request_uri;
        }
        return 404;
}