docker-compose、wsl2 和自签名 ssl 证书

问题描述 投票:0回答:5

因此,当我在 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

所以我希望有人能找到解决方案或能给我指出正确的方向:)

docker-compose openssl wsl-2 self-signed-certificate
5个回答
0
投票

本地开发:成为您自己的CA

这是您在网络上本地创建 ssl 的最佳教程

https://www.youtube.com/watch?v=oxDUdjbdfR0&t=1558s

确保将根证书安装到浏览器中

不然不行


生产: 只需使用 certbot 即可解决问题 命令会是这样的

certbot --nginx -d ${SERVER2} -d ${SERVER1}

0
投票

您可能遇到 DNS 解析问题。在 nginx 位置中使用 Docker 嵌入的 DNS 解析器:

resolver 127.0.0.11

我还建议使用根 CA 和

ssl_trusted_certificate
指令。

安全示例

要进行比较,请参阅此 Curity 示例,该示例通过主机文件、通配符证书、根 CA、docker compose 和 nginx 使用 DNS:

这是一个相当高级的示例,具有两种形式的相互 TLS,尽管它也与您的要求有很多共同点。所以希望它能帮助您解决您的问题。


0
投票

HTTPS 使用端口 443,但 SSL/TLS 本身不使用任何端口。 在您的 docker 配置中,有一行包含

- '443:433'
。这是拼写错误还是您的实际端口映射?对于网络端口映射,请查看此文档:https://docs.docker.com/compose/networking/


0
投票

对于任何会关注此问题的人,我找到了一个对我来说非常有效的解决方案。 我最终做的是用 ngrok 来运行它。并在 docker-compose 文件中实现该实现。 我可以选择使用 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 容器来完成这项工作


-1
投票

我知道这已经很老了,但我一直在努力让 HTTPS 站点在我的 QNAP nas 服务器(Docker 容器)上运行。

我在解决方案中看不到任何有关如何获取身份验证密钥的内容,因此我假设您在该配置中使用了上面 yml 的一部分?

我对 Docker 和 Linux 还很陌生,所以也许我只是错过了一些东西。我有 8 个开发网站在没有 https 的情况下也能正常工作,但对于某些网站来说,它必须是安全的,因为某些 WordPress 开发工具需要它。

您与解决方案脚本一起使用的先前脚本中是否存在某些内容?

非常感谢

© www.soinside.com 2019 - 2024. All rights reserved.