Запуск Nginx Docker с самозаверяющим сертификатом SSL

#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 может оставить ключ незашифрованным, поэтому вам не нужен файл паролей.