使用 Docker 生成 Let’s Encrypt 證書


概念

  1. 什么是 Container ?
    https://www.docker.com/resources/what-container
    https://www.docker.com/why-docker
  2. 什么是 Let’s Encrypt ?
    Let’s Encrypt is a free, automated, and open Certificate Authority.

安裝

  1. 安裝Docker

    https://docs.docker.com/install/linux/docker-ce/ubuntu/

  2. 獲取 images

    docker pull linuxserver/letsencrypt
    

主角

詳細介紹及使用方法:

hub.docker.com/r/linuxserver/letsencrypt

github.com/linuxserver/docker-letsencrypt

簡要中文闡述

此鏡像包含了Nginx服務器、反向代理、PHP和用於生成或續簽證書的letsencrypt client,也包含了用於防御入侵的fail2ban。
本文使用的是http的方式請求的證書,故使用tls-snidns方式的讀者,請參考【詳細介紹及使用方法】鏈接里的原文

使用方法

<>中加入合適的值即可。

docker run \
  --cap-add=NET_ADMIN \
  --name=letsencrypt \
  -v <path to data>:/config \
  -e PGID=<gid> -e PUID=<uid>  \
  -e EMAIL=<email> \
  -e URL=<url> \
  -e SUBDOMAINS=<subdomains> \
  -e VALIDATION=http \
  -p 80:80 -p 443:443 \
  -e TZ=Asia/Shanghai \
  linuxserver/letsencrypt

參數介紹

參考來自github.com,有修改。

  • -p 80 -p 443 - 端口號
  • -v /config - 所有的配置文件及網站根目錄路徑(筆者:只需指定可讀寫路徑即可,容器生成時會在此路徑生成一堆文件),下文<your-path>指的就是這個。
  • -e URL - 頂級域名,比如 test.com
  • -e SUBDOMAINS - 二級域名 比如 www,ftp,cloud 多個二級域名用“,”隔開, http方式不支持泛域名,如想使用,請使用dns方式,本文不做介紹。
  • -e VALIDATION - letsencrypt 驗證所使用的方法
  • -e PGID for GroupID - 詳情見下面說明, 不可使用root的GID
  • -e PUID for UserID - 詳情見下面說明, 不可使用root的UID
  • -e TZ - timezone ie. Asia/Shanghai

User / Group 標識

有時在使用數據卷( -v標志)時,主機操作系統和容器之間可能會出現權限問題。 我們通過允許您指定用戶PUID和組PGID來避免此問題。 確保主機上的數據卷目錄由您指定的同一用戶擁有並且它能“正常工作”。

在這種情況下, PUID=1001並且PGID=1001 。 要找到你的id user ,請使用id user ,如下所示:

id <dockeruser>

運行

敲入上面的命令(docker run ....)后,首次使用需要生成DH參數,需要耐心等待啦。
查看狀態

docker logs -f letsencrypt

如果看到如下所示就大功告成啦。

......
......
......
Server ready

那么,申請的證書在哪?
在輸出的狀態中可知:證書存在於<your-path>/config/etc/letsencrypt/live/<domain> 中,至於里面的證書都是用來干嘛的,請參考該目錄下的README。本文不做描述

反向代理

該鏡像默認的設置已經對反向代理做了優化(感謝大佬),最簡單的方式就是找到<your-path>/config/nginx/proxy-confs下適合自己的配置文件,去掉.sample即可。但是筆者發現,好像這里面的配置不適合所有情況,故還要自己寫配置文件.......

注意:反向代理分為兩種方式,第一種是通過同一域名不同路徑作為反向代理,第二種是不同域名指向不同虛擬主機作為反向代理。本文使用的第二種,詳情可以看<your-path>/config/nginx/proxy-confs/_readme

切換路徑

cd <your-path>/config/nginx/site-confs

不要理會 default , 當然,直接修改里面的文件也行,筆者為了簡潔,直接新建文件

創建文件 <your-domain> 比如

touch test.com

修改文件

vi test.com

文件內容如下

server {
    listen 443 ssl;

    server_name <your-domain>;

    charset utf-8;

    include /config/nginx/ssl.conf;

    client_max_body_size 0;

    location / {
        include /config/nginx/proxy.conf;
        proxy_pass <Web-OR-ContainerName>;
    }
}

注意<your-domain>中填寫域名,<Web-OR-ContainerName>中要填寫反向代理的網址或者是容器名稱,比如說proxy_pass http://gogsWeb:3000/;,至於容器之間如何互聯,請看下節。如果需要創建多個反向代理,就如法炮制,再創建文件,再新建個虛擬主機,以server_name區分即可。

容器互聯

參考docs.docker.com

docker network create cert_network
docker network connect cert_network <other-container>
docker network connect cert_network letsencrypt

注意,需要互聯的容器建立時不需要指定'-P'即端口與主機端口綁定!!!只需要確保容器內端口開放即可。

是時候結束一切了

docker restart letsencrypt

參考

https://github.com/linuxserver/docker-letsencrypt
https://hub.docker.com/r/linuxserver/letsencrypt/
https://letsencrypt.org/
https://docs.docker.com/engine/reference/commandline
http://nginx.org/en/docs/http/configuring_https_servers.html
https://www.zybuluo.com/phper/note/89391
https://segmentfault.com/a/1190000009583997
https://blog.csdn.net/gripleaf/article/details/8552324

聲明

本文采用知識共享署名-非商業性使用-相同方式共享 2.5 中國大陸許可協議進行許可,發表在CSDN博客園,歡迎讀者轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接!請讀者/爬蟲們尊重版權


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM