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

2022-08-30 20:51:45

我正在对我们当前的旧应用程序进行欺骗。我们使用几种服务,但我有问题的是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>

这是我的 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”响应:enter image description here


答案 1

除了启用 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 的有效安全链。大多数浏览器允许您继续请求或将站点添加为例外,以便不再显示警告。


答案 2

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

• 在 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

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

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

• 在集装箱内打开端口:443docker-compose

- "443:443"

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

• 在 Apache 中启用 SSL:

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

不过,从技术上讲,我首先从正在运行的容器中执行此操作,然后是 .使测试内容更加容易,并确保在提交重新生成映像之前一切正常。apachectl restart

•在Apache中配置您的网站,以便他们通过编辑和您想要使用SSL的任何其他域来使用SSL:mysite.localhost

<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

重新生成映像,并根据需要重新启动容器。

...et voilà!


推荐