首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >docker-组合、wsl2和自签名ssl证书

docker-组合、wsl2和自签名ssl证书
EN

Stack Overflow用户
提问于 2022-01-05 13:30:59
回答 4查看 2.3K关注 0票数 3

所以,我在做Wordpress站点时,使用docker来设置本地开发环境。现在,我正在尝试修复,以便能够为本地dev环境获得一个自签名ssl证书。但是,当我试图访问这个站点时,我得到的只是ERR_CONNECTION_CLOSED,而错误日志或其他任何东西都没有。

所以我的docker-compose.yml文件是这样的:

代码语言:javascript
复制
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配置文件的样子:

代码语言:javascript
复制
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 (ubuntu20.04)上使用openssl创建证书文件,我使用了以下命令:

代码语言:javascript
复制
openssl req -newkey rsa:2048 -nodes -keyout mydomain.com.key -x509 -days 365 -out mydomain.com.crt

这样我就可以在没有https的情况下访问这个网站了,而且一切都很好。但是当我试图用https访问站点时,我得到了错误的ERR_CONNECTION_CLOSED,我不知道从哪里开始。我尝试过许多不同的解决方案,但到目前为止还没有成功。

还很高兴知道我在dns中将dev.mydomain.com指向了127.0.0.1。并将其添加到Windows上的主机文件中。

但我有种感觉,我在这里缺少一些东西。

我的计划是让一个通配符域指向localhost,并使坞-组合安装或多或少是自动的,以便在运行docker-compose up -d时设置自签名证书。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-05-04 07:57:59

对于任何想看这个的人来说,我找到了一个对我有用的解决方案。我最后做的是用ngrok来运行它。并让那个工具在坞-合成文件中。我可以选择使用ngrok给我的域名运行jsut。或者使用我自己的(如果是这样的话,这需要一个额外的帐户)。所以,我的docker-compose.yml文件现在是这样的:

代码语言:javascript
复制
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:

正如您在这里看到的,我正在使用夜/夜码头容器来完成这项工作。

票数 0
EN

Stack Overflow用户

发布于 2022-01-12 13:00:47

本地开发:是您自己的CA

这是在web上本地创建ssl的最佳教程。

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

确保将根证书安装到浏览器中。 否则,它就没用了

生产:只使用certbot,它将执行如下的技巧命令

代码语言:javascript
复制
certbot --nginx -d ${SERVER2} -d ${SERVER1}
票数 0
EN

Stack Overflow用户

发布于 2022-01-12 19:12:06

看来你可能有DNS解析问题。在nginx位置内使用Docker嵌入式DNS解析器:

代码语言:javascript
复制
resolver 127.0.0.11

我还建议使用根CA和ssl_trusted_certificate指令。

CURITY示例

有关要与之比较的内容,请参阅此Curity示例,该示例通过主机文件、通配符证书、根CA、docker组合和nginx使用DNS:

这是一个非常高级的示例,包含两种相互TLS,尽管它与您的需求也有许多共同之处。希望它能帮助你解决你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70593721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档