docker-撰写、wsl2 和自签名 ssl 证书
docker-compose, wsl2 and self signed ssl certificate
因此,当我在 Wordpress 网站上工作时,我正在使用 docker-compose 来设置本地开发环境。
现在我正在尝试修复,以便我可以获得该本地开发环境的自签名 ssl 证书。但是当我尝试访问该站点时,我最终得到的结果是 ERR_CONNECTION_CLOSED 而错误日志或任何内容中都没有。
这就是我的 docker-compose.yml 文件的样子:
version: '3.1'
services:
wordpress:
image: wordpress:5.8-fpm
restart: always
container_name: wordpress
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- ./wp:/var/www/html
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
depends_on:
- db
db:
image: mysql:5.7
restart: always
container_name: db
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
ports:
- "8086:3306"
nginx:
image: nginx:latest
container_name: nginx
ports:
- '80:80'
- '443:433'
volumes:
- ./nginx:/etc/nginx/conf.d
- ./logs/nginx:/var/log/nginx
- ./wp:/var/www/html
- ./certs:/etc/cert
depends_on:
- wordpress
restart: always
mailhog:
image: mailhog/mailhog
ports:
- "1025:1025" # smtp server
- "8025:8025" # web ui
volumes:
db:
这就是我的 nginx 配置文件的样子:
server {
listen 80;
listen [::]:80;
server_name dev.mydomain.com;
root /var/www/html;
index index.php;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
server {
listen 443 ssl ssl;
server_name dev.mydomain.com;
root /var/www/html;
index index.php;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
ssl_certificate /etc/cert/mydomain.com.crt;
ssl_certificate_key /etc/cert/mydomain.com.key;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
为了创建证书文件,我使用以下命令在 wsl2 (ubuntu 20.04) 上使用了 openssl:
openssl req -newkey rsa:2048 -nodes -keyout mydomain.com.key -x509 -days 365 -out mydomain.com.crt
所以我可以在没有 https 的情况下访问该站点,并且一切正常。但是,当我尝试使用 https 访问该站点时,出现错误 ERR_CONNECTION_CLOSED,而且我不知道从哪里开始。我尝试了很多不同的解决方案,但到目前为止都没有成功。
也很高兴知道我已将 dev.mydomain.com 指向 dns 中的 127.0.0.1。并将其添加到 Windows.
上的主机文件中
但我觉得这里缺少一些东西。
我的计划是让通配符域指向本地主机,并使 docker-compose 安装或多或少自动设置自签名证书,当我 运行 docker-compose up -d
所以我希望有人有解决方案或者可以指出正确的方向:)
本地开发人员:成为您自己的 CA
这是在本地创建 ssl 的最佳网络教程
https://www.youtube.com/watch?v=oxDUdjbdfR0&t=1558s
Make sure to install your root cert into the browser
otherwise, it won't work
生产: 只需使用 certbot 即可
命令将是这样的
certbot --nginx -d ${SERVER2} -d ${SERVER1}
您似乎遇到了 DNS 解析问题。在 nginx 位置使用 Docker 嵌入式 DNS 解析器:
resolver 127.0.0.11
我还建议使用根 CA 和 ssl_trusted_certificate
指令。
货币示例
要进行比较,请参阅此 Curity 示例,该示例通过主机文件、通配符证书、根 CA、docker compose 和 nginx 使用 DNS:
这是一个相当高级的示例,具有两种形式的相互 TLS,但它也与您的要求有很多共同点。所以希望它能帮助你解决你的问题。
HTTPS 使用端口 443,但 SSL/TLS 本身不使用任何端口。
在您的 docker 配置中,有一行包含 - '443:433'
。这是错字还是您的实际端口映射?对于网络端口映射,请查看此文档:https://docs.docker.com/compose/networking/
对于任何会看这个的人,我找到了一个非常适合我的解决方案。
我最终做的是 运行 用 ngrok 代替它。并将该工具放入 docker-compose 文件中。
我可以选择 jsut 运行 使用 ngrok 给我的域名。或者使用我自己的(如果需要,这需要高级帐户)。这就是我的 docker-compose.yml 文件现在的样子:
version: '3.1'
networks:
default:
services:
wordpress:
image: wordpress:5.9.0-php8.0-fpm
restart: always
container_name: wordpress
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- ./wp:/var/www/html
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
depends_on:
- db
db:
image: mysql:5.7
restart: always
container_name: db
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
ports:
- "8086:3306"
nginx:
image: nginx:latest
container_name: nginx
networks:
- default
ports:
- '80:80'
volumes:
- ${NGINX_CONF_DIR:-./nginx}:/etc/nginx/conf.d
- ${NGINX_LOG_DIR:-./logs/nginx}:/var/log/nginx
- ${WORDPRESS_DATA_DIR:-./wp}:/var/www/html
depends_on:
- wordpress
restart: always
ngrok:
image: wernight/ngrok:latest
ports:
- '4040:4040'
links:
- nginx
environment:
NGROK_PROTOCOL: http
NGROK_REGION: eu
NGROK_PORT: nginx:80
NGROK_AUTH: my auth key
NGROK_HOSTNAME: if I want my own domain otherwise comment this out
depends_on:
- nginx
networks:
- default
mailhog:
image: mailhog/mailhog
ports:
- "1025:1025" # smtp server
- "8025:8025" # web ui
volumes:
db:
如您所见,我正在使用 wernight/ngrok docker 容器来完成这项工作
因此,当我在 Wordpress 网站上工作时,我正在使用 docker-compose 来设置本地开发环境。 现在我正在尝试修复,以便我可以获得该本地开发环境的自签名 ssl 证书。但是当我尝试访问该站点时,我最终得到的结果是 ERR_CONNECTION_CLOSED 而错误日志或任何内容中都没有。
这就是我的 docker-compose.yml 文件的样子:
version: '3.1'
services:
wordpress:
image: wordpress:5.8-fpm
restart: always
container_name: wordpress
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- ./wp:/var/www/html
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
depends_on:
- db
db:
image: mysql:5.7
restart: always
container_name: db
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
ports:
- "8086:3306"
nginx:
image: nginx:latest
container_name: nginx
ports:
- '80:80'
- '443:433'
volumes:
- ./nginx:/etc/nginx/conf.d
- ./logs/nginx:/var/log/nginx
- ./wp:/var/www/html
- ./certs:/etc/cert
depends_on:
- wordpress
restart: always
mailhog:
image: mailhog/mailhog
ports:
- "1025:1025" # smtp server
- "8025:8025" # web ui
volumes:
db:
这就是我的 nginx 配置文件的样子:
server {
listen 80;
listen [::]:80;
server_name dev.mydomain.com;
root /var/www/html;
index index.php;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
server {
listen 443 ssl ssl;
server_name dev.mydomain.com;
root /var/www/html;
index index.php;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
ssl_certificate /etc/cert/mydomain.com.crt;
ssl_certificate_key /etc/cert/mydomain.com.key;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
为了创建证书文件,我使用以下命令在 wsl2 (ubuntu 20.04) 上使用了 openssl:
openssl req -newkey rsa:2048 -nodes -keyout mydomain.com.key -x509 -days 365 -out mydomain.com.crt
所以我可以在没有 https 的情况下访问该站点,并且一切正常。但是,当我尝试使用 https 访问该站点时,出现错误 ERR_CONNECTION_CLOSED,而且我不知道从哪里开始。我尝试了很多不同的解决方案,但到目前为止都没有成功。
也很高兴知道我已将 dev.mydomain.com 指向 dns 中的 127.0.0.1。并将其添加到 Windows.
上的主机文件中但我觉得这里缺少一些东西。
我的计划是让通配符域指向本地主机,并使 docker-compose 安装或多或少自动设置自签名证书,当我 运行 docker-compose up -d
所以我希望有人有解决方案或者可以指出正确的方向:)
本地开发人员:成为您自己的 CA
这是在本地创建 ssl 的最佳网络教程
https://www.youtube.com/watch?v=oxDUdjbdfR0&t=1558s
Make sure to install your root cert into the browser
otherwise, it won't work
生产: 只需使用 certbot 即可 命令将是这样的
certbot --nginx -d ${SERVER2} -d ${SERVER1}
您似乎遇到了 DNS 解析问题。在 nginx 位置使用 Docker 嵌入式 DNS 解析器:
resolver 127.0.0.11
我还建议使用根 CA 和 ssl_trusted_certificate
指令。
货币示例
要进行比较,请参阅此 Curity 示例,该示例通过主机文件、通配符证书、根 CA、docker compose 和 nginx 使用 DNS:
这是一个相当高级的示例,具有两种形式的相互 TLS,但它也与您的要求有很多共同点。所以希望它能帮助你解决你的问题。
HTTPS 使用端口 443,但 SSL/TLS 本身不使用任何端口。
在您的 docker 配置中,有一行包含 - '443:433'
。这是错字还是您的实际端口映射?对于网络端口映射,请查看此文档:https://docs.docker.com/compose/networking/
对于任何会看这个的人,我找到了一个非常适合我的解决方案。 我最终做的是 运行 用 ngrok 代替它。并将该工具放入 docker-compose 文件中。 我可以选择 jsut 运行 使用 ngrok 给我的域名。或者使用我自己的(如果需要,这需要高级帐户)。这就是我的 docker-compose.yml 文件现在的样子:
version: '3.1'
networks:
default:
services:
wordpress:
image: wordpress:5.9.0-php8.0-fpm
restart: always
container_name: wordpress
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- ./wp:/var/www/html
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
depends_on:
- db
db:
image: mysql:5.7
restart: always
container_name: db
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
ports:
- "8086:3306"
nginx:
image: nginx:latest
container_name: nginx
networks:
- default
ports:
- '80:80'
volumes:
- ${NGINX_CONF_DIR:-./nginx}:/etc/nginx/conf.d
- ${NGINX_LOG_DIR:-./logs/nginx}:/var/log/nginx
- ${WORDPRESS_DATA_DIR:-./wp}:/var/www/html
depends_on:
- wordpress
restart: always
ngrok:
image: wernight/ngrok:latest
ports:
- '4040:4040'
links:
- nginx
environment:
NGROK_PROTOCOL: http
NGROK_REGION: eu
NGROK_PORT: nginx:80
NGROK_AUTH: my auth key
NGROK_HOSTNAME: if I want my own domain otherwise comment this out
depends_on:
- nginx
networks:
- default
mailhog:
image: mailhog/mailhog
ports:
- "1025:1025" # smtp server
- "8025:8025" # web ui
volumes:
db:
如您所见,我正在使用 wernight/ngrok docker 容器来完成这项工作