Nginx+docker+Certbot 获取和更新免费的ssl证书
certbot官网:https://certbot.eff.org/(需要魔法)
下载docker:https://www.runoob.com/docker/centos-docker-install.html
开始前准备
1、用docker下载和准备certbot
docker run -it --rm certbot/certbot --help
2、用docker下载nginx镜像
3、购买好了域名 并且ICP备案了
然后你的域名DNS打开了 比如你买的主域名的xxx.com 你的DNS打开了www.xxx.com
开始步骤
1、理清docker nginx和certbot文件映射关系,做好文件映射
nginx和certbot有两个文件夹要共用:证书生成文件夹和web验证文件夹
容器启动命令如下
(1)准备nginx的启动脚本
这里使用了docker run 语法挂载docker的nginx的配置文件
docker run --rm -p 80:80 -p 443:443 --name nginx --privileged=true \
-v /nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ #挂载nginx的配置文件 我这里直接挂载配置文件出来 你们也可以挂整个文件夹 这个nginx.conf是文件 不是文件夹 所以要先在自己目录下创好 不然挂挂载会有问题
-v /nginx/html:/etc/nginx/html \#挂载nginx的静态html
-v /nginx/log:/var/log/nginx \ #挂载nginx的log
-v /nginx/docker/certbot/www:/usr/share/certbot/www \ #与certbot容器共用,http验证目录
-v /nginx/docker/certbot/ssl:/usr/share/certbot/ssl \ #与certbot容器共用,证书位置
-d nginx \#这个nginx是你的镜像名称
(2)准备certbot的启动脚本
这里使用了docker run 语法挂载docker的certbot的配置文件
docker run -it --rm \
-v /nginx/docker/certbot/www:/data/letsencrypt \ #与nginx容器共用
-v /nginx/docker/certbot/ssl:/etc/letsencrypt \#与nginx容器共用
-v /nginx/docker/certbot/logs:/var/log/letsencrypt \ #挂载日志文件
certbot/certbot certonly -n --webroot --webroot-path=/data/letsencrypt -m 你的邮箱@qq.com --agree-tos -d "你的域名"
2、启动nginx(上面的nginx启动脚本),修改挂载的域名配置文件/nginx/conf/nginx.conf
修改你的配置文件的80端口(默认只有80端口) ,如果你有443端口的就注释掉
server {
listen 80;
listen [::]:80;
server_name xxx.com;#你的域名
server_tokens off;
#配置http验证可访问
location ~/.well-known/acme-challenge/ {
#此目录都是nginx容器内的目录,对应宿主机volumes中的http验证目录,而宿主机的又与certbot容器中命令--webroot-path指定目录一致,从而就整个串起来了,解决了http验证问题
root /usr/share/certbot/www;
}
#http跳转到https
location / {
return 301 https://xxx.com$request_uri; #xxx.com换成你的域名
}
#配置文件汇总其它的先不要 注释掉
}
3、重启你的nginx
docker restart nginx
4、执行certbot容器命令(在步骤1中准备好了)
如无意外会出现succee提示,证书创建成功了
5、修改conf.d中的网站配置文件,增加ssl配置
注意:这里的证书地址为nginx里的地址,不要填成宿主机地址
server {
listen 80;
listen [::]:80;
rewrite ^(.*)$ https://$host$1 permanent; #将80端口转发到443
}
server { #http服务,一个server可以配置多个location
listen 443 ssl;
server_name www.xxx.com; #主机名、域名
server_tokens off;
ssl_certificate /usr/share/certbot/ssl/live/www.wangyuhaooo.cn/fullchain.pem; #证书里面,必须是包含两套完整的-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----
ssl_certificate_key /usr/share/certbot/ssl/live/www.wangyuhaooo.cn/privkey.pem; #证书密钥文件
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location /{
root /etc/nginx/html/; #这个路径是docker的nginx里面的静态文件路径 不是本地服务器的静态文件路径
index index.html ;
}
}
6、重启nginx,查看日志,打开域名测试
docker restart nginx
docker logs -tf --tail 20 nginx
certbot的证书只有三个月时间 所以要写一个重启脚本
更新证书脚本如下:
renew_cert.sh
docker run -it --rm \
-v /nginx/docker/certbot/www:/data/letsencrypt \ #与nginx容器共用,http验证目录
-v /nginx/docker/certbot/ssl:/etc/letsencrypt \ #与nginx容器共用,证书生成目录
-v /nginx/docker/certbot/logs:/var/log/letsencrypt \ #certbot日志
certbot/certbot renew
把 renew_cert.sh 脚本放入Linux的crontab即可,每三月执行一次就可以