终于破解了这个问题,并且能够在我的开发和生产站点上成功地重复该过程以使 SSL 证书正常工作!
抱歉帖子太长了!
在我的设置中,我在 ubuntu 16 机器上安装了 docker docker-compose。
任何遇到此问题的人都会详细说明我所做的步骤。
-
转到您的代码所在的目录
cd /opt/example_dir/
-
为letsencrypt和它的站点创建一个目录。
sudo mkdir -p /opt/example_dir/letsencrypt/letsencrypt-site
-
从letsencrypt目录创建准系统docker-compose.yml文件。
sudo nano /opt/example_dir/letsencrypt/docker-compose.yml
添加以下内容:
version: '2'
services:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- ./letsencrypt-site:/usr/share/nginx/html
networks:
- docker-network
networks:
docker-network:
driver: bridge
* This will pull down the latest nginx version
* Expose port 80
* Mount a config file (that i'll create later)
* Maps the site directory so that we can have a simple test index.html for when
我们启动简单的 nginx 容器。
-
在/opt/example_dir/letsencrypt中创建一个nginx.conf文件
sudo nano /opt/example_dir/letsencrypt/nginx.conf
将以下内容放入其中
server {
listen 80;
listen [::]:80;
server_name example_server.com;
location ~ /.well-known/acme-challenge {
allow all;
root /usr/share/nginx/html;
}
root /usr/share/nginx/html;
index index.html;
}
* This listens for requests on port 80 for the server with name example_server.com
* Gives the Certbot agent access to ./well-known/acme-challenge
* Sets the default root and file
- 接下来在
/opt/example_dir/letsencrypt/letsencrypt-site中创建一个index.html文件
sudo nano /opt/example_dir/letsencrypt/letsencrypt-site/index.html
添加以下内容
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>LetsEncrypt Setup</title>
</head>
<body>
<p>Test file for our http nginx server</p>
</body>
</html>
#### 基本 nginx 容器的所有部件就位!
-
现在我们启动 nginx 容器。
cd /opt/example_dir/letsencrypt
sudo docker-compose up -d
nginx 容器现已启动并运行,访问您定义的 url,您应该会返回测试 index.html 页面。此时我们已经准备好运行 certbot 命令来生成一些证书了
-
运行以下命令生成证书,将--email 替换为您的电子邮件
sudo docker run -it --rm \
-v /docker-volumes/etc/letsencrypt:/etc/letsencrypt \
-v /docker-volumes/var/lib/letsencrypt:/var/lib/letsencrypt \
-v /opt/example_dir/letsencrypt/letsencrypt-site:/data/letsencrypt \
-v "/docker-volumes/var/log/letsencrypt:/var/log/letsencrypt" \
certbot/certbot \
certonly --webroot \
--email youremail@domain.com --agree-tos --no-eff-email \
--webroot-path=/data/letsencrypt \
-d example.com
- 以交互模式运行 docker,以便查看输出。
- 完成生成证书后,它将自行删除。
- 它将装载 4 个卷:
- 存储证书的letsencrypt文件夹/
- 一个 lib 文件夹
- 映射我们的站点文件夹
- 映射日志路径
- 同意 ToS
- 指定根网络路径
- 指定要为其生成证书的服务器地址。
如果该命令运行正常,那么我们已经为该 Web 服务器生成了证书。我们现在可以在我们的生产站点中使用这些,并将 nginx 配置为使用 ssl 并使用这些证书!
-
关闭 nginx 容器
cd /opt/example_dir/letsencrypt/
sudo docker-compose down
设置生产 nginx 容器
目录结构现在应该是这样的。你有你的代码/网络应用项目,然后是我们上面创建的letsencrypt文件夹。
/opt/example_dir
/ -> project_folder
/ -> letsencrypt
-
创建文件夹调用 dh-param
sudo mkdir -p /opt/example_dir/project_folder/dh-param
-
生成 dh 密钥
sudo openssl dhparam -out /opt/example_dir/project_folder/dh-param/dhparam-2048.pem 2048
更新/opt/example_dir/project_folder内的docker-compose.yml和nginx.conf文件
project_folder 是我的源代码所在的位置,因此我在这里为 nginx 创建了一个生产配置文件,并更新 docker-compose.yml 以挂载我的 nginx 配置、dh-pharam 交换密钥以及我们之前创建的证书本身。
docker-compose 中的 nginx 服务
nginx:
image: nginx:1.11.3
restart: always
ports:
- "80:80"
- "443:443"
- "8000:8000"
volumes:
- ./nginx.conf:/etc/nginx/conf.d/default.conf
- ./dh-param/dhparam-2048.pem:/etc/ssl/certs/dhparam-2048.pem
- /docker-volumes/etc/letsencrypt/live/exampleserver.com/fullchain.pem:/etc/letsencrypt/live/exampleserver.com/fullchain.pem
- /docker-volumes/etc/letsencrypt/live/exampleserver.com/privkey.pem:/etc/letsencrypt/live/exampleserver.com/privkey.pem
networks:
- docker-network
volumes_from:
- flask
depends_on:
- flask
- falcon
links:
- datastore
project_folder 中的 nginx.conf
error_log /var/log/nginx/error.log warn;
server {
listen 80;
listen [::]:80;
server_name exampleserver.com
location / {
rewrite ^ https://$host$request_uri? permanent;
}
#for certbot challenges (renewal process)
location ~ /.well-known/acme-challenge {
allow all;
root /data/letsencrypt;
}
}
#https://exampleserver.com
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name exampleserver.com;
server_tokens off;
ssl_certificate /etc/letsencrypt/live/exampleserver.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/exampleserver.com/privkey.pem;
ssl_buffer_size 8k;
ssl_dhparam /etc/ssl/certs/dhparam-2048.pem;
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;
# Define the specified charset to the “Content-Type” response header field
charset utf-8;
}
至此,一切就绪! (最后)
-
启动 docker 容器。
cd /opt/example_dir/project_folder
sudo docker-compose up -d
# Check the docker log with:
sudo docker logs -f -t
我知道这需要很多步骤,但这就是我所做的,它对我有用,希望对其他人有所帮助。