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

Tzo*_*Noy 3 php apache ssl https docker

我正在对我们当前的旧应用进行泊坞。我们使用了几种服务,但我遇到的问题是php,apache,尤其是apache的https。我正在使用“ php:5.6.30-apache”映像,所以我已经预装了php和apache。

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

<VirtualHost *:80>
    ServerAdmin admin@admin.io
    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>
Run Code Online (Sandbox Code Playgroud)

这是我的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
Run Code Online (Sandbox Code Playgroud)

不用介意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
Run Code Online (Sandbox Code Playgroud)

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

"ERR_SSL_PROTOCOL_ERROR"
Run Code Online (Sandbox Code Playgroud)

根据评论的要求,我的“ docker ps”响应: 在此处输入图片说明

Fab*_*ert 10

下面是我如何在 Docker 中启用 Apache SSL 进行本地开发。这是 Docker 在 macOS 上运行 Ubuntu 映像(尽管mkcert也适用于 Linux 和 Windows):

• 在 macOS 中,安装 mkcert

brew install mkcert
brew install nss # if you use Firefox
Run Code Online (Sandbox Code Playgroud)

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

• 创建 SSL 证书:

mkcert mysite.localhost someothersite.localhost localhost 127.0.0.1 ::1
Run Code Online (Sandbox Code Playgroud)

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

mysite.localhost+4-key.pem
mysite.localhost+4.pem
Run Code Online (Sandbox Code Playgroud)

• 使这两个.pem文件可用于您的 Docker 容器。例如:将它们与容器的配置文件一起移动并添加如下内容:

- ./config/ssl:/etc/apache2/ssl/
Run Code Online (Sandbox Code Playgroud)

443在容器的开放端口docker-compose

- "443:443"
Run Code Online (Sandbox Code Playgroud)

(而且您当然也应该EXPOSE 443在图像中,尽管出于某种原因它对我有用而没有这样做。)(编辑:EXPOSE纯粹是文档,根据文档不执行任何操作)

• 在 Apache 中启用 SSL:

RUN ln -s /etc/apache2/mods-available/ssl.load  /etc/apache2/mods-enabled/ssl.load
Run Code Online (Sandbox Code Playgroud)

不过,从技术上讲,我首先从正在运行的容器中执行此操作,然后是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>
Run Code Online (Sandbox Code Playgroud)

...只需从 复制您的旧配置<VirtualHost *:80>,将端口更改为443,然后添加上面的三行。

重建映像并根据需要沿途重新启动容器。

……等等!


THe*_*per 6

除了启用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
Run Code Online (Sandbox Code Playgroud)

请在您的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/
Run Code Online (Sandbox Code Playgroud)

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

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

<VirtualHost *:443>
  SSLEngine on
  SSLCertificateFile /etc/apache2/ssl/ssl.crt
  SSLCertificateKeyFile /etc/apache2/ssl/ssl.key
  ....
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

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