在 Docker 中启用 Apache SSL 进行本地开发

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

我正在对我们当前的旧应用程序进行docker化。我们使用多种服务,但我遇到的问题是 php、apache,特别是 apache 的 https。我使用的是“php:5.6.30-apache”镜像,所以我预装了 php 和 apache。

现在我用以下内容更改了“000-default.conf”:

<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot /var/www/html/app/htdocsAdmin
    ServerName admin.local.app.io
    CustomLog /var/log/apache2/app.admin.access.log "trueip_combined"
    ErrorLog /var/log/apache2/app.admin.error.log
    <Directory /var/www/html/app/htdocsAdmin>
        AllowOverride Options FileInfo AuthConfig
        Require all granted
    </Directory>
</VirtualHost>

这是我的 docker 文件:

FROM php:5.6.30-apache

MAINTAINER Tzook Bar Noy

ADD default /etc/apache2/sites-available/000-default.conf


RUN apt-get update \
  && apt-get install -y apt-utils \
  && apt-get install -y php5-dev php5-memcached \
  && apt-get install -y memcached



RUN apt-get update && apt-get install -y apt-utils
RUN apt-get install -y libz-dev libmemcached-dev
RUN pecl install memcached-2.2.0
RUN echo extension=memcached.so >> /usr/local/etc/php/conf.d/memcached.ini

RUN a2enmod rewrite
RUN a2enmod ssl


EXPOSE 80
EXPOSE 443

不要介意memcached的东西,只需看看我启用“ssl”并公开端口80,443

这是使用 docker-compose 运行的:

php:
build:
  context: ./php
  dockerfile: Dockerfile
ports:
  - "80:80"
  - "443:443"
volumes:
  - ./../../:/var/www/html
networks:
  - appnet
tty: true

但毕竟,我仍然从 chrome 得到这个:

"ERR_SSL_PROTOCOL_ERROR"

根据评论中的要求,我的“docker ps”回复:

php apache ssl docker https
3个回答
34
投票

除了启用 ssl 和公开端口 443 之外,您还需要创建一个(自签名)证书 + 私钥并确保 Apache 可以访问这些内容。

我建议使用 openSSL 创建自签名证书:

openssl req -new -newkey rsa:4096 -days 3650 -nodes -x509 -subj \
    "/C=../ST=...../L=..../O=..../CN=..." \
    -keyout ./ssl.key -out ./ssl.crt

填写您的 2 个字母的国家/地区代码 (/C)、您所在的州或省的名称 (/ST)、您所在地区的名称 (/L)、您所在组织的名称,而不是点 (...) (/O) 和您的服务器 FQDN (/CN)

然后将以下行添加到您的 docker 文件中:

COPY ./path/to/ssl.crt /etc/apache2/ssl/ssl.crt
COPY ./path/to/ssl.key /etc/apache2/ssl/ssl.key
RUN mkdir -p /var/run/apache2/

我不确定最后一行是否真的必要,但在我的 docker 容器中,该文件夹还不存在,导致 Apache 在启动时失败。

最后在 000-default.conf 文件中,您需要添加如下内容:

<VirtualHost *:443>
  SSLEngine on
  SSLCertificateFile /etc/apache2/ssl/ssl.crt
  SSLCertificateKeyFile /etc/apache2/ssl/ssl.key
  ....
</VirtualHost>

请注意,当您使用自签名证书时,大多数浏览器会警告您“您的连接不安全”(Firefox) 或“证书无效”(Chrome)。这是因为没有到可信 CA 的有效安全链。大多数浏览器允许您继续请求或将该网站添加为例外,以便不再显示警告。


18
投票

以下是我如何在 Docker 中启用 Apache SSL 进行本地开发。这是 Docker 在 macOS 上运行 Ubuntu 映像的情况(尽管

mkcert
也适用于 Linux 和 Windows):

• 在 macOS 中,安装 mkcert:

brew install mkcert
brew install nss # if you use Firefox

mkcert
可以轻松创建和安装 SSL 证书以供本地开发使用。

• 创建 SSL 证书:

mkcert mysite.localhost someothersite.localhost localhost 127.0.0.1 ::1

这将为您在 macOS 上安装它们,但也会在当前工作目录中保留它们的副本:

mysite.localhost+4-key.pem
mysite.localhost+4.pem

• 使两个

.pem
文件可供您的Docker 容器使用。例如:将它们与容器的配置文件一起移动并添加类似的内容:

- ./config/ssl:/etc/apache2/ssl/

• 打开容器

443
中的端口
docker-compose

- "443:443"

(你当然也应该在图像中

EXPOSE 443
,尽管出于某种原因它对我有用,但没有这样做。)(编辑:EXPOSE纯粹是文档,并且根据文档不执行任何操作)

• 在 Apache 中启用 SSL:

RUN ln -s /etc/apache2/mods-available/ssl.load  /etc/apache2/mods-enabled/ssl.load

不过,从技术上讲,我首先在运行的容器中执行此操作,然后是

apachectl restart
。使测试变得更容易,并确保在提交重建图像之前一切正常。

• 在 Apache 中配置您的网站,以便通过编辑

mysite.localhost

 以及您想要使用 SSL 的任何其他域来使用 SSL:

<VirtualHost *:443> … SSLEngine on SSLCertificateFile "/etc/apache2/ssl/clickandspeak.localhost+4.pem" SSLCertificateKeyFile "/etc/apache2/ssl/clickandspeak.localhost+4-key.pem" … </VirtualHost>

…只需复制

<VirtualHost *:80>

 中的旧配置,将端口更改为 
443
,然后添加上面的三行即可。

根据需要重建镜像并重启容器。

…瞧!


0
投票
标准 apache 容器内置了创建自签名证书的所有工具。

将以下内容添加到您的 Dockerfile 中:

# Enable SSL RUN set -eux; \ apt-get update; \ apt-get install ssl-cert; \ a2enmod ssl; \ a2ensite default-ssl
    
© www.soinside.com 2019 - 2024. All rights reserved.