docker Portainer:客户端向HTTPS服务器发送HTTP请求-尽管URL为https://

ulydmbyx  于 2023-10-16  发布在  Docker
关注(0)|答案(3)|浏览(294)

我对主题服务器配置相当新,现在我得到了一个问题,以达到一个容器与ssl证书。

我的设置是什么:

我有一个乌藨子派,上面有Docker。连接到端口80和443的容器是反向代理,其将传入子域引导到不同的其它容器。示例:webserver.my-domain.com导致IP地址为192.168.178.69:8080。我通过sites-enabled文件夹中的配置将其存档:

<VirtualHost *:80>
 ServerName webserver.my-domain.com
 ProxyPreserveHost On 
 DocumentRoot /var/www/html
 ProxyPass /.well-known !
 ProxyPass / http://192.168.178.69:8080/
 ProxyPassReverse / http://192.168.178.69:8080/
RewriteEngine on
RewriteCond %{SERVER_NAME} =webserver.my-domain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

我还在反向代理容器内创建了一个let's encrypt证书。这创建了一个额外的文件webserver-le-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost *:443>
 ServerName webserver.my-domain.com
 ProxyPreserveHost On 
 DocumentRoot /var/www/html
 ProxyPass /.well-known !
 ProxyPass / http://192.168.178.69:8080/
 ProxyPassReverse / http://192.168.178.69:8080/

SSLCertificateFile /etc/letsencrypt/live/my-domain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/my-domain.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

到目前为止还不错。如果我尝试URL https://webserver.my-domain.com,我的内容可用。

  • 我的问题是什么 *

我使用Portainer来管理我的Docker容器,我希望Portainer可以通过portainer.my-domain.com使用。这是sites-enabled内部的portainer配置:

<VirtualHost *:80>
 ServerName portainer.my-domain.com
 ProxyPreserveHost On 
 DocumentRoot /var/www/html
 ProxyPass /.well-known !
 ProxyPass / http://192.168.178.69:9443/
 ProxyPassReverse / http://192.168.178.69:9443/
RewriteEngine on
RewriteCond %{SERVER_NAME} =portainer.my-domain.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

还有ssl的配置:

<IfModule mod_ssl.c>
<VirtualHost *:443>
 ServerName portainer.my-domain.com
 ProxyPreserveHost On 
 DocumentRoot /var/www/html
 ProxyPass /.well-known !
 ProxyPass / http://192.168.178.69:9443/
 ProxyPassReverse / http://192.168.178.69:9443/

SSLCertificateFile /etc/letsencrypt/live/my-domain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/my-domain.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

如果我调用192.168.178.69:9443/,我可以毫无问题地访问容器。但是,如果我尝试到达URL portainer.my-domain.com,我刚刚收到消息:

Client sent an HTTP request to an HTTPS server.

但在URL中显示:https://portainer.my-domain.com/。所以我不明白为什么会有HTTP请求,即使我的浏览器显示连接是https。
有人能给我解释一下,告诉我怎么解决这个问题吗?

更新:我的解决方案经过多次尝试,我找到了一个解决方案:当我将反向代理和portainer作为docker容器运行时,我将这两个容器放入一个使用docker-compose的网络中:

version: "3.4"

services:
  apache:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /home/pi/reverse-proxy/:/etc/apache2
    networks:
      - homeserver

  portainer:
    image: portainer/portainer-ce:latest
    ports:
      - "8000:8000"
      - "9000:9000"
      - "9443:9443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer_data:/data
    networks:
      - homeserver

networks:
  homeserver:

volumes:
  portainer_data:

apache 2的卷是/etc/apache2的完整配置文件夹。之后,我将ProxyPass的IP更改为容器的名称:

ProxyPass / http://reverse-proxy_portainer_1:9000/
 ProxyPassReverse / http://reverse-proxy_portainer_1:9000/

经过这些改变,它工作了。

mqkwyuun

mqkwyuun1#

我在Apache2代理后面的Portainer 2.13.1中遇到了同样的问题。我解决了这个问题,运行镜像时选择启用端口9000,这是Portainer的HTTP端口。这假设您将在外部阻止端口9000,并仅通过受HTTPS保护的代理访问它。这是我的命令

docker run -d -p 9000:9000 -p 8000:8000 -p 9443:9443 \
   --name portainer \
   --restart=always \
   -v /var/run/docker.sock:/var/run/docker.sock \
   -v portainer_data:/data 
   portainer/portainer-ce:latest

然后,我的VirtualHost文件指向端口9000,如下所示:

<IfModule mod_ssl.c>
    <VirtualHost *:443>

            ProxyPreserveHost On
            Proxyrequests Off

            ServerName docker.<domain.tld>
            ServerAdmin admin@<domain.tld>

            ProxyPass / http://127.0.0.1:9000/
            ProxyPassReverse / http://127.0.0.1:9000/

            ErrorLog ${APACHE_LOG_DIR}/portainer-error.log
            CustomLog ${APACHE_LOG_DIR}/portainer-access.log combined

            SSLCertificateFile /etc/letsencrypt/live/docker.<domain.tld>/fullchain.pem
            SSLCertificateKeyFile /etc/letsencrypt/live/docker.<domain.tld>/privkey.pem
            Include /etc/letsencrypt/options-ssl-apache.conf

    </VirtualHost>

确保无法使用Linux中的ufw等工具从外部访问端口8000、9000和9443。

vzgqcmou

vzgqcmou2#

所以根据你的问题看来这是可行的

ProxyPass / http://192.168.178.69:8080/

但这并不:

ProxyPass / http://192.168.178.69:9443/

请注意,在这两种情况下都使用了普通的http://协议,即使涉及到不同的端口。端口号9443表明您需要的是https://而不是http://。如果是这种情况,这将解释您得到的错误消息:由于将协议设置为http://而不是https://,所以发送普通HTTP请求。
但在URL中显示:https://portainer.my-domain.com/
这里的协议与客户端和nginx之间的连接有关,而不是nginx和内部服务器之间的连接。后者取决于ProxyPass URL中给出的协议。

nhn9ugyo

nhn9ugyo3#

我也有同样的信息。
经过研究,我是这样解决的:
我的旧网址:http://IP:9443
我的新网址:https://IP:9443

相关问题