Я настроил HTTPS на локальном хосте со следующим Dockerfile:
FROM ubuntu:latest
ENV DEBIAN_FRONTEND=noninteractive TZ=America/New_York APACHE_RUN_USER=www-data APACHE_RUN_GROUP=www-data APACHE_LOG_DIR=/var/log/apache2 APACHE_LOCK_DIR=/var/lock/apache2 APACHE_PID_FILE=/var/run/apache2.pid
COPY . /var/www/html
WORKDIR /var/www/html
# install apache, php, ssl cert for localhost
RUN apt-get update && \
apt-get -y install apt-utils tzdata apache2 php libapache2-mod-php && \
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \
a2enmod ssl headers rewrite && \
mv ./apache/ssl-cert-snakeoil.pem /etc/ssl/certs/ssl-cert-snakeoil.pem && \
mv ./apache/ssl-cert-snakeoil.key /etc/ssl/private/ssl-cert-snakeoil.key && \
mv ./apache/000-default.conf /etc/apache2/sites-available/000-default.conf
EXPOSE 80 443
# start webserver
CMD /usr/sbin/apache2ctl -D FOREGROUND
Где ssl-cert-snakeoil.pem
и ssl-cert-snakeoil.key
были созданы с:
openssl req -x509 -out ssl-cert-snakeoil.pem -keyout ssl-cert-snakeoil.key \
-newkey rsa:2048 -nodes -sha256 \
-subj '/CN=localhost' -extensions EXT -config <( \
printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")
и 000-default.conf
выглядит так:
<VirtualHost *:80>
ServerName localhost
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:443>
DocumentRoot "/var/www/html/"
ServerName localhost
SSLEngine on
SSLCertificateFile "/etc/ssl/certs/ssl-cert-snakeoil.pem"
SSLCertificateKeyFile "/etc/ssl/private/ssl-cert-snakeoil.key"
</VirtualHost>
Теперь я могу получить доступ к https://localhost
в своем браузере, но он выдает предупреждение о том, что сертификат не является доверенным.Я понимаю, что могу добавить сертификат в хранилище доверенных сертификатов браузера, но моя цель состоит в том, чтобы другие программы, работающие в контейнерах, могли иметь доступ к https://localhost
на хост-компьютере.
Другие ответы на StackExchange (1 , 2 , 3 ) говорят, что я смогу сделать это, переместив мой ssl-cert-snakeoil.pem
из контейнера, обслуживающего https://localhost
, в тот, кто хочет получить к нему доступ конкретнок одному из /usr/share/ca-certificates/
, /usr/local/share/ca-certificates/
, /etc/ssl/certs/
(в зависимости от ответа), а затем к одному из dpkg-reconfigure ca-certificates
или update-ca-certificates --fresh
(опять же, в зависимости от ответа).
Итак,Я запускаю контейнер с docker run --network="host" -it ubuntu /bin/bash
, добавляю сертификаты в разные места и запускаю различные команды, но ничего не получится.Запуск dpkg-reconfigure ca-certificates
выглядит многообещающе, потому что он на самом деле побуждает меня сказать: «Этот пакет устанавливает общие сертификаты CA (центра сертификации) в / usr / share / ca-Certificates», а затем просит меня выбрать из списка CA, который я выяснил Я мог бы добавить к echo /path/to/cert.crt >> /etc/ca-certificates.conf
.Но это не сработает.
Я выполнил все эти шаги и все их комбинации, но когда я пытаюсь curl https://localhost
, я все равно получаю curl: (60) SSL certificate problem: unable to get local issuer certificate
.Точно так же PHP жалуется, когда я пытаюсь запустить <?php echo file_get_contents("https://localhost");
, говоря PHP Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages:
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in /t.php on line 1
.Что я делаю неправильно?Кроме того, поскольку я пытаюсь выполнить все это в Dockerfile, мне нужен способ запуска dpkg-reconfigure ca-certificates
неинтерактивно (если это действительно правильная команда).