centos7下docker部署nginx使用let's encrypt免费证书

大牌提供商的SSL证书可不便宜,对于大公司也许不算什么,但是对于小公司及个人来说贵了。现在国外出现的免费SSL服务商Let’s Encrypt,绝对是小公司或者开发者的福音

前提条件

  1. 拥有一个域名,例如 mydemo.com (在国内主机的用的话,还需要通过ICP备案)
    在域名服务器创建一条A记录,指向云主机的公网IP地址。例如demo.mydemo.com指向xxx.xxx.xxx.xxx的IP地址,要等到新创建的域名解析能在公网上被解析到。
    据说国内的域名提供商对letsencrypt的支持非常差,但是经过试验,至少现阶段用dnspod解析的域名还没碰到问题。
  2. docker和docker-compose有一定的基础,且已经用docker部署了nginx环境

通过certbot脚本安装

没有特殊情况,首选采用certbot脚本方式。

由于letsencrypt证书的有效期只有90天,需要长期使用的话,需要在失效前进行延长申请。用certbot脚本工具,可以将延期申请的脚本写到定时任务来自动完成,非常方便。

1、安装certbot工具

yum install -y epel-release
yum install -y certbot

2、使用certbot命令申请证书

# 使用方法:certbot certonly --webroot -w [Web站点目录] -d [站点域名] -m [联系人email地址] --agree-tos
sudo certbot certonly --webroot -w /webser/www/blog -d mydemo.com -m li_xxxxx@163.com --agree-tos

注意:联系人email地址要填写真实有效的,letsencrypt会在证书在过期以前发送预告的通知邮件。 申请成功后,会显示以下Congratulations信息

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/mydemo.com/fullchain.pem. Your cert will
   expire on 2017-03-20. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

证书的保存位置在:

ll /etc/letsencrypt/live/mydemo.com/

#用户证书                                   
cert.pem -> ../../archive/mydemo.com/cert1.pem
#中间证书                                    
chain.pem -> ../../archive/mydemo.com/chain1.pem
#证书链chain.pem + cert.pem    
fullchain.pem -> ../../archive/mydemo.com/fullchain1.pem
#证书私钥
privkey.pem -> ../../archive/mydemo.com/privkey1.pem

3、查看命令有效期

openssl x509 -noout -dates -in /etc/letsencrypt/live/mydemo.com/cert.pem

4、设置定时任务自动更新证书

letsencrypt证书的有效期是90天,但是可以用脚本去更新。

#配置crontab,每月1好5时更新证书,并重启docker容器
00 05 01 * * sudo /usr/bin/certbot renew --quiet && sudo docker restart nginx

注意:更新证书时候网站必须是能访问到的

5、生成Perfect Forward Security(PFS)键值

PFS(perfect forward secrecy),中文可叫做完全前向保密。要求一个密钥只能访问由它所保护的数据;用来产生密钥的元素一次一换,不能再产生其他的密钥;一个密钥被破解,并不影响其他密钥的安全性。

#创建目录
mkdir /etc/ssl/private/ -p
#执行命令
cd /etc/ssl/private/
openssl dhparam 2048 -out dhparam.pem

6、将证书目录挂载到nginx容器中

我是用docker-compose管理容器的,以下是我docker-compse.yml文件 中nginx编排信息

php-fpm:
  build: docker.io/php:7.1.8-fpm
  container_name: php-fpm
  volumes:
    - /webser/www:/var/www/html
    - /etc/hosts:/etc/hosts
    - /webser/etc/php:/usr/local/etc/php/conf.d
  ports:
    - "9000:9000"      
nginx:
  image: docker.io/nginx
  container_name: nginx
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - /webser/www:/var/www/html
    - /webser/etc/nginx:/etc/nginx/conf.d
    - /webser/logs/nginx:/var/log/nginx
    - /etc/ssl:/etc/ssl
    - /etc/letsencrypt:/etc/letsencrypt
  links:
    - php-fpm

也可以用docker命令挂载容器

docker run -d -v /etc/ssl:/etc/ssl -v /etc/letsencrypt:/etc/letsencrypt --name nginx docker.io/nginx

7、nginx的配置

server {
    listen 443 ssl http2;
    server_name fungli.top;
    access_log  /var/log/nginx/access-blog.log main;
    error_log /var/log/nginx/error-blog.log warn;
    root /var/www/html/blog/;
    index  index.html index.htm index.php;

    # letsencrypt生成的文件
    ssl_certificate /etc/letsencrypt/live/mydemo.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mydemo.com/privkey.pem;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets on;

    ssl_dhparam /etc/ssl/private/dhparam.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    # 一般推荐使用的ssl_ciphers值: https://wiki.mozilla.org/Security/Server_Side_TLS
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK';
    ssl_prefer_server_ciphers on;

    location ~ \.php  {
                root /var/www/html/blog;
        include fastcgi_params;
        fastcgi_pass php-fpm:9000;
        fastcgi_split_path_info ^(.+\.php)(.*)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    }

    location ~* ^.+\.(jpg|jpeg|gif|png|bmp|css|js|swf)$ {
        access_log off;
        #break;
    }

}
  • 0
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页
评论

打赏作者

小贤就是我

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值