编辑1:

编辑1:

我为我的电子邮件服务器找到了这个docker解决方案https://mailcow.email/。此解决方案包含一个 Web 面板和 certbot。我想要做的是使用 proxypass两个都http 和 https 连接到 nginx docker 镜像,该镜像已为 http 和 https 处理设置了一切。换句话说,我想要:

  • 内部 certbot 能够更新内部证书
  • 如果 https 连接到达我的服务器,则让 docker 镜像处理它
  • 如果收到 http 请求并且不是 letsencrypt 更新强制转为 https

到目前为止我尝试的是进行以下配置:

server {
   listen 80;
   server_name mail.example.com;
   #rewrite ^ https://$server_name$request_uri? permanent;

   location /.well-known/acme-challenge {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 100m;

   }

   location / {
        proxy_pass http://127.0.0.1:8443/;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 100m;
   }
}

但没有成功。我可以连接到https://example.com:8443但不是https://example.com。但是,当收到 http 请求时,我设法重定向到 https,结果我的浏览器无法连接。

我想要代理的docker镜像是:

2daeaa065165        nginx:mainline-alpine   "/bin/sh -c 'envsu..."   56 minutes ago      Up 56 minutes (healthy)   0.0.0.0:8080->8080/tcp, 80/tcp, 0.0.0.0:8443

它监听端口 8080 的 http 连接和端口 8443 的 https 连接。

你们知道我该如何解决这个问题吗?

编辑1:

我把配置改成:

server {
   listen 80;
   server_name mail.example.com;

   location /.well-known/acme-challenge {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 100m;

   }

   location / {
        rewrite ^(.*) https://$server_name$1 permanent;
   }

}

server {
 listen 443;
 server_name mail.example.com;

 ssl_certificate     /opt/docker-mailcow/data/assets/ssl/cert.pem;
 ssl_certificate_key /opt/docker-mailcow/data/assets/ssl/key.pem;
 ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers         HIGH:!aNULL:!MD5;


 location / {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 100m;
 }

}

浏览器返回以下消息:

连接到 mail.thundermail.ml 时发生错误。SSL 收到的记录超出了最大允许长度。错误代码:SSL_ERROR_RX_RECORD_TOO_LONG

这些密钥还具有以下权限:

pcmagas@DockerMailserver:/opt/docker-mailcow/data/assets/ssl$ ls -l
σύνολο 24
drwxr-xr-x 3 root    root    4096 Ιούν 23 20:35 acme
-rw-r--r-- 1 pcmagas pcmagas 1675 Ιούν 23 19:49 ca-key.pem
-rw-r--r-- 1 pcmagas pcmagas 1034 Ιούν 23 19:49 ca.pem
-rw-r--r-- 1 pcmagas pcmagas 1107 Ιούν 23 19:49 cert.pem
-rw-r--r-- 1 pcmagas pcmagas  424 Ιούν 23 19:49 dhparams.pem
-rw-r--r-- 1 pcmagas pcmagas 1679 Ιούν 23 19:49 key.pem

答案1

只需将 nginx 配置更改为:

server {
   listen 80;
   server_name mail.example.com;

   location /.well-known {
        proxy_pass http://127.0.0.1:8080/.well-known ;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 100m;

   }

   location / {
        rewrite ^(.*) https://$server_name$1 permanent;
   }

}

server {
 listen 443 ssl;
 server_name mail.example.com;

 ssl_certificate     /opt/docker-mailcow/data/assets/ssl/cert.pem;
 ssl_certificate_key /opt/docker-mailcow/data/assets/ssl/key.pem;
 ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers         HIGH:!aNULL:!MD5;


 location / {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 100m;
 }

}

其中ssl_certificatessl_certificate_key指向一个文件,该文件是acme-mailcowdocker 镜像卷生成证书的目录。

请记住设置ADDITIONAL_SANMAILCOW_HOSTNAME的邮件服务器的正确 MX 记录。

还要mail.example.com用您自己的 MX 记录替换(在我的情况下应该与 A 记录相同)。

相关内容