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)
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,然后添加上面的三行。
重建映像并根据需要沿途重新启动容器。
……等等!
除了启用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的有效安全链。大多数浏览器都允许您继续请求或将网站添加为例外,因此不再显示警告。
| 归档时间: |
|
| 查看次数: |
9003 次 |
| 最近记录: |