Docker获取Let`s Encrypt SSL 证书

Posted 落雷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker获取Let`s Encrypt SSL 证书相关的知识,希望对你有一定的参考价值。

文中的操作都是在CentOS Stream release 9下执行的,使用的是root用户。

1. 安装docker

# 卸载原有的docker
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置docker-ce源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 安装docker-compose
wget https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-linux-x86_64
chmod +x docker-compose-linux-x86_64 && mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose && ldconfig

2. Let`s Encrypt及Certbot介绍

关于Let`s Encrypt可以参见这里

certbot安装使用参加这里

3. Docker运行Certbot获取证书

为了方便维护、升级,同时也避免破坏本地的开发环境,我这里使用docker方式来运行certbot。整个过程分为两步:首次申请证书和证书更新。

3.1 首次申请证书

因为我的文章都是通过jekyll运行的静态网站,之后会通过nginx来运行,所以这里就以nginx为例来配置网站的tls证书。

  1. 创建nginx配置文件default.conf
server 
    listen      80;
    server_name example.com www.example.com;

    # 高优先级,仅用于更新证书
    location ~ /.well-known/acme-challenge 
        allow all;
        root /data/letsencrypt;
    

  1. docker-compose文件:
version: \'3.3\'

services:
  nginx:
    image: nginx:1.23.4-alpine
    container_name: frontend
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
      - ./frontend:/usr/share/nginx/html
    ports:
      - 80:80
  1. 启动web服务: docker-compse up -d
  2. 启动certbot申请证书:

docker run --rm -it -v ./certbot/etc/letsencrypt:/etc/letsencrypt -v ./certbot/var/log/letsencrpt:/var/log/letsencrypt -v ./frontend:/data/letsencrypt certbot/certbot:latest certonly --webroot --email your@eamil.com --agree-tos --no-eff-email --webroot-path=/data/letsencrypt -d example.com -d example.com

运行结束后可以在./certbot/etc/letsencrypt/live目录下找到example.com文件夹,其中包含证书文件fullchain.pem和私钥文件privkey.pem

  1. 停止web服务:docker-compose down
  2. 更新compose文件:
version: \'3.3\'

services:
  nginx:
    image: nginx:1.23.4-alpine
    container_name: frontend
    volumes:
      - ./default.conf:/etc/nginx/conf.d/default.conf
      # - ./frontend:/usr/share/nginx/html
      - ./certbot/etc/letsencrypt/live:/letsencrypt/live        # 当前证书目录
      - ./certbot/etc/letsencrypt/archive:/letsencrypt/archive  # 历史证书目录
      - ./dhparam-2048.pem:/letsencrypt/dhparam-2048.pem        # 使用2048位DH(Diffie-Hellman)参数
    ports:
      - 80:80
      - 443:443

2048为DH参数生成命令:openssl dhparam -out ./dhparam-2048.pem 2048

  1. 更新nginx配置文件
# 处理http请求
server 
    listen      80;
    server_name example.com www.example.com;

    # 重定向到https
    location / 
        rewrite ^ https://$host$request_uri? permanent;
    

    # 高优先级,仅用于更新证书
    location ~ /.well-known/acme-challenge 
        allow all;
        root /data/letsencrypt;
    


# 处理https请求
server 
    listen 443 ssl http2;
    server_name example.com www.example.com;

    server_tokens off;

    ssl_certificate /letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /letsencrypt/live/example.com/privkey.pem;

    ssl_buffer_size 8k;

    ssl_dhparam /letsencrypt/dhparam-2048.pem; # 使用2048位DH参数,加强安全

    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

    ssl_ecdh_curve secp384r1;
    ssl_session_tickets off;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8;

    root /usr/share/nginx/html;
    index index.html;

  1. 重新启动web服务:docker-compose up -d

3.2 证书更新

  1. 通过以下脚本可以实现证书更新:
#!/bin/bash

docker run -it --rm \\
-v ./certbot/etc/letsencrypt:/etc/letsencrypt \\
-v ./certbot/var/lib/letsencrypt:/var/lib/letsencrypt \\
-v ./certbot/var/log/letsencrypt:/var/log/letsencrypt \\
-v ./site:/data/letsencrypt \\
certbot/certbot \\
renew --webroot -w /data/letsencrypt --quiet && docker kill --signal=HUP frontend
  1. crontab -e新增一条定时任务,每月1号00:00更新一次证书:0 0 1 * * YOURPATH/renew.sh

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意


Let's Encrypt ssl证书怎么下载?

我想问一下,我申请好了Let's Encrypt SSL证书后,我要怎么样操作才能下载这个证书呢?因为服务器是用Apache,Apache使用SSL 时,需要选择证书文件.pem和.key文件。

在Let's Encrypt申请免费SSL证书证书成功之后,就可以获得四个文件,默认会放在这里:

    /etc/letsencrypt/live/域名/fullchain.pem

    /etc/letsencrypt/live/域名/privkey.pem

    /etc/letsencrypt/live/域名/cert.pem

    /etc/letsencrypt/live/域名/chain.pem

然后配置apache启动SLL

Ubuntu下启用SSL模块非常简单

$ sudo a2enmod ssl
$ sudo a2ensite default-ssl.conf
$ sudo service apache2 restart

启动成功后,在:/etc/apache2/mods-enabled#中可以查看到ssl.conf配置文件,同时/etc/apache2/的ports.conf中监听443端口。

Apache SSL配置文件default-ssl.conf

<virtualhost *:443>
ServerName 域名
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/域名/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/域名/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/域名/chain.pem <FilesMatch "\\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars </FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars </Directory>
#####其余的和普通的DjangoApache配置一样</virtualhost>

http重定向配置文件

<virtualhost *:80>
ServerName 域名
RewriteEngine on
RewriteCond %HTTPS off
RewriteRule ^(.*)$ https://域名%REQUEST_URI [R=301,L]</virtualhost>

apache打开rewrite

使上述的重定向生效,需要启动apache的rewrite模块。

$ sudo a2enmod rewrite

打开443端口

这里使用的UFW防火墙,所以需要打开443端口

ufw allow 443

重启Aapche服务器

$ sudo service apache2 restart

打开网站就可以看到https。

参考技术A

您好!

全球可信的正式注册Apache SSL证书您需要登陆Gworg,获取PEM、KEY根证书文件。

以上是关于Docker获取Let`s Encrypt SSL 证书的主要内容,如果未能解决你的问题,请参考以下文章

为Nginx申请和使用Let‘s Encrypt的SSL免费证书

为Nginx申请和使用Let‘s Encrypt的SSL免费证书

Let's Encrypt 证书申请及配置

解决 Let’s Encrypt SSL 证书配置错误

let‘s encrypt配置SSL

使用 Certbot 申请 Let's Encrypt SSL 证书,并定时续期