Apache Docker容器虚拟主机SSL配置

Apache Docker容器虚拟主机SSL配置,apache,ssl,docker,virtualhost,http-proxy,Apache,Ssl,Docker,Virtualhost,Http Proxy,我有以下设置并且工作正常(我在Docker 1.6上): 一个Docker容器充当在各个Docker容器中运行的其他web应用程序的虚拟主机代理。(我应该补充一点,我不是配置服务器或网络的高手。) 我一直在尝试将SSL添加到设置中,但几乎没有成功。每个容器在主机上装载证书的文件目录。例如,要运行容器,请使用以下命令: docker run -d -P --name build \ -v /home/applications/src/ssl-cert:/etc/ssl/certs \

我有以下设置并且工作正常(我在Docker 1.6上):

一个Docker容器充当在各个Docker容器中运行的其他web应用程序的虚拟主机代理。(我应该补充一点,我不是配置服务器或网络的高手。)

我一直在尝试将SSL添加到设置中,但几乎没有成功。每个容器在主机上装载证书的文件目录。例如,要运行容器,请使用以下命令:

docker run -d -P --name build \
    -v /home/applications/src/ssl-cert:/etc/ssl/certs \
    -e "DBL=mysql:dbname=build;host=192.168.0.1;port=3306" \
    -e "DB_USER=foo" -e "DB_PASS=bar" \
    --link mysql56:mysql \
    --add-host dockerhost:`/sbin/ip addr | grep 'eth0' | grep 'inet' | cut -d'/' -f1 | awk '{print $2}'` \
    -p 8001:80 -p 4431:443 \
     repos/build:latest
如果我尝试连接到
https://build.example.com
我收到证书错误,无法连接。容器的Apache配置在default-ssl.conf中为证书文件提供了适当的配置(如果这是一个独立实例,则此配置有效):

此容器还包含相同的默认值-ssl.conf

我已尝试在几种不同的配置中运行此功能:

  • 仅在Apache代理容器中运行SSL配置
  • 仅在生成应用程序容器中运行SSL配置
  • 在两个容器中运行SSL配置

如果我觉得我错过了一些明显的东西,但却无法确定它会是什么。在这样的配置中运行SSL时,我缺少什么吗?

通常,如果您的服务器在apache服务器后面运行,您只需要配置apache以使用SSL证书即可。 如果Apache是唯一“外部”公开的服务器,而其他服务器无法从外部世界直接访问,则会出现这种情况

您需要apache通过url或端口(例如:

<VirtualHost *:443>
    ServerName SERVERNAME_HERE

    SSLProtocol all -SSLv2 -SSLv3
    SSLHonorCipherOrder On
    SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS

    SSLCertificateFile /etc/ssl/certs/build.crt
    SSLCertificateKeyFile /etc/ssl/certs/build.key
    SSLCACertificateFile /etc/ssl/certs/digicert/digicertca.crt

    # Proxy pass to other server
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / http://OTHER_SERVER_IP_WITHIN_DOCKER_NETWORK:8081/
    ProxyPassReverse / http://OTHER_SERVER_IP_WITHIN_DOCKER_NETWORK:8081/

<!--Other config-->
</VirtualHost>

服务器名服务器名\u在这里
SSLProtocol all-SSLv2-SSLv3
SSLHonorCipherOrder开启
SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!阿努尔:!MD5:!决策支持系统
SSLCertificateFile/etc/ssl/certs/build.crt
SSLCertificateKeyFile/etc/ssl/certs/build.key
SSLCACertificateFile/etc/ssl/certs/digicert/digicertca.crt
#代理传递到其他服务器
代理请求关闭
代理主机
ProxyPass/http://OTHER_SERVER_IP_WITHIN_DOCKER_NETWORK:8081/
ProxyPassReverse/http://OTHER_SERVER_IP_WITHIN_DOCKER_NETWORK:8081/

希望这对您有所帮助…

当我们想向反向代理后面的主机添加SSL时,我们可以通过三种方式配置主机:

  • 边缘:反向代理解密传入的HTTPS流量,并通过纯文本HTTP与后端服务器通信
  • 传递:后端服务器解密所有流量,反向代理只将HTTPS请求转发给它们
  • 混合:反向代理解密HTTPS流量,然后重新加密绑定到后端服务器的流量
第一个选项是最容易设置的,我们只需要在反向代理上安装证书和配置SSL。第二种“传递”方法使后端服务器能够独立管理其SSL配置,但反向代理现在是“盲”的,因为它无法读取加密的通信量,我们可能希望这样做(例如)记录。当代理必须读取流量,但我们也不信任代理和后端服务器之间的网络时,我们将使用第三种混合配置

根据问题中的信息,第一个选项似乎最合适,因为我们信任反向代理和后端服务器之间的内部Docker网络。我们可以从后端服务器删除SSL配置,并将请求从反向代理转发到它们的标准HTTP端口

此设置需要两个附加组件:

  • 在代理上配置的基于名称的虚拟主机,用于转发每个后端服务的请求
  • 保护所有后端域名的单个证书(作为多个主题或作为通配符,如*.example.com)
下面是我们可以构建的虚拟主机配置示例部分:


ServerName build.example.com
代理请求关闭
代理主机
ProxyPass/http://build:8001/ 
ProxyPassReverse/http://build:8001/
ServerName cicd.example.com
代理请求关闭
代理主机
ProxyPass/http://cicd:8002/ 
ProxyPassReverse/http://cicd:8002/
…并记住在默认虚拟主机块中配置SSL指令。如果我们链接容器或在同一Docker网络上运行它们,我们可以在httpd.conf中使用它们的容器名作为主机名,如上图所示


说到网络,这个问题似乎表明我们需要更仔细地研究一下,因为我没有看到任何提示表明容器被配置为相互通信(503响应状态支持这个假设)。反向代理容器必须将请求转发到每个后端容器,但除非我们(已弃用)或在容器之间创建内部代理,否则它无法转发请求:

$ docker network create build_network
$ docker run --network build_network --name apache_proxy ...
$ docker run --network build_network --name build ...
$ docker run --network build_network --name cicd ...
当我们在同一个用户定义的网络上运行容器时,它们可以通过Docker的内部DNS解析器按容器名称解析其他容器的IP地址(或者如果我们将
--hostname
参数指定为
Docker run
,则通过备用主机名解析)。还要注意,因为每个容器代表离散主机,所以我们不需要增加它们的端口号(8001、8002等)。我们可以使用端口80为来自内部网络上每个容器的HTTP流量提供服务

+────────────────── Docker主机─────────────────+
│  +────────────── 建立网络─────────────+  │
│  │
<VirtualHost *:443>
    ServerName SERVERNAME_HERE

    SSLProtocol all -SSLv2 -SSLv3
    SSLHonorCipherOrder On
    SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS

    SSLCertificateFile /etc/ssl/certs/build.crt
    SSLCertificateKeyFile /etc/ssl/certs/build.key
    SSLCACertificateFile /etc/ssl/certs/digicert/digicertca.crt

    # Proxy pass to other server
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyPass / http://OTHER_SERVER_IP_WITHIN_DOCKER_NETWORK:8081/
    ProxyPassReverse / http://OTHER_SERVER_IP_WITHIN_DOCKER_NETWORK:8081/

<!--Other config-->
</VirtualHost>
$ docker network create build_network
$ docker run --network build_network --name apache_proxy ...
$ docker run --network build_network --name build ...
$ docker run --network build_network --name cicd ...