#docker #nginx #ssl
Вопрос:
Я пытаюсь запустить приложение пользовательского интерфейса с помощью Docker, используя изображение nginx, я могу получить доступ к службе на порту 80 без каких-либо проблем, но всякий раз, когда я пытаюсь получить к нему доступ через https на 443-м порту, я не могу получить доступ к приложениям, которые сайт продолжает загружать, и в конечном итоге становится недоступным.файл nginx.conf в default.conf для разрешения доступа через порт 443
Ниже приведен мой файл nginx.conf
charset utf-8;
server {
listen 80;
server_name localhost;
root /usr/nginx/html;
}
server {
listen 443;
server_name localhost;
root /usr/nginx/html;
}
Я добавил самозаверяющий сертификат SSL в папку / usr / nginx и предоставил порт 443 через Dockerfile
Ниже приведен мой файл Dockerfile
FROM nginx
COPY dist /usr/nginx/html
RUN chmod -R 777 /usr/nginx/html/*
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY domain.crt /usr/nginx
EXPOSE 80:443
ENTRYPOINT nginx -g 'daemon off;'
Может кто-нибудь, пожалуйста, объясните мне, порт 443 не разрешает никакого доступа
Ответ №1:
Чтобы сервер nginx разрешил шифрование SSL, вам необходимо указать флаг ssl при прослушивании в nginx.conf, и только ssl-сертификата будет недостаточно, вам также понадобятся ключ и пароль SSL-сертификата, и они должны быть настроены
charset utf-8;
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
}
server {
listen 443 ssl;
ssl_certificate /usr/nginx/ssl.crt;
ssl_certificate_key /usr/nginx/ssl.key;
ssl_password_file /usr/nginx/ssl.pass;
server_name localhost;
root /usr/nginx/html;
}
и вам нужно поместить сертификат ssl, ключ и пароль через тома или через встраивание в контейнер docker, если вы запускаете контейнер через кластер kubernetes, добавление их через секреты kubernetes будет лучшим вариантом
Для Dockerfile вы можете добавить, например
FROM nginx
COPY dist /usr/nginx/html
RUN chmod -R 777 /usr/nginx/html/*
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY ssl.crt /usr/nginx/
COPY ssl.pass /usr/nginx/
COPY ssl.key /usr/nginx/
EXPOSE 80:443
ENTRYPOINT nginx -g 'daemon off;'
Для получения дополнительной информации вы можете обратиться к статье Nginx Docker https://medium.com/@agusnavce/nginx-server-with-ssl-certificates-with-lets-encrypt-in-docker-670caefc2e31
Комментарии:
1. В случае SSL-сертификатов, созданных с помощью openssl, нужно ли нам предоставлять все три сертификата, ключ и пароль, поскольку сертификат и ключ будут сгенерированы из пароля
2. На самом деле это может быть возможным сценарием использования только пароля, но я раньше не делал ничего подобного
3. @codeViking93: openssl никогда не генерирует ключ из пароля; он генерирует ключ из случайных данных и обычно шифрует этот ключ с помощью пароля. Ничто (включая openssl) никогда не сможет сгенерировать сертификат из пароля. Однако openssl может поместить как ключ, так и сертификат в один файл, который может использовать nginx (указать для
ssl_certificate
и опуститьssl_certificate_key
), а openssl может оставить ключ незашифрованным, поэтому вам не нужен файл паролей.