老姜讲技术

优秀是一种习惯!

--亚里士多德

docker下使用letsencrypt申请证书

docker运行的web站点,想在不停机的情况下使用letsencrypt申请证书,还是需要费一番劲的。

letsencrypt提供几种申请证书的方式,主流的有standalone,webroot,dns。

standalone是由letsencrypt运行一个独立的webserver,来达到验证通过的目的,很明显这个过程需要暂时关闭你的网站服务,对于一些不想关闭网站服务的站点来说并不友好。

另一个常用的方法是webroot,letsencrypt会在你的网站目录下放置一个临时文件,用于验证,验证服务器请求到验证文件验证通过后,letsencrypt客户端会删除该文件,文件内容是每次随机生成的字符串。

在docker运行的nginx webserver下如何使用letsencrypt颁发证书呢?

首先需要修改nginx配置,添加一个alias配置,如果你的站点是非静态站点,使用php,java,python等作为网站的fastcgi后端,那么需要将这个配置放置于其他路径匹配规则之前。

location ^~ /.well-known/acme-challenge/ {
    alias /var/www/challenges/;
}

docker运行nginx时,将/var/www/challenges映射到本地目录。

通过certbot的docker镜像进行证书申请,certbot是letsencrypt的一种实现。注意替换你的域名和邮箱地址。

docker run -it --rm --name certbot -v $PWD/letsencrypt:/etc/letsencrypt -v $PWD/challenges:/usr/share/nginx/html/.well-known/acme-challenge certbot/certbot:amd64-v1.3.0 certonly --webroot -w /usr/share/nginx/html --agree-tos -d www.yoursite.com -m youremail@somemail.com

接下来你就会在$PWD/letsencrypt/live/www.yoursite.com/下看到你的证书。修改nginx配置使用证书,并将证书映射到docker下。

ssl_certificate /etc/letsencrypt/live/www.yoursite.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.yoursite.com/privkey.pem;