it-roy-ru.com

Добавление SSL-сертификатов в док-контейнер NGINX не работает

Я пытаюсь добавить сертификаты SSL (сгенерированные с помощью LetsEncrypt) к моему nginx. Nginx создается из файла docker-compose, в котором я создаю том от моего хоста до контейнера, чтобы контейнеры могли получить доступ к сертификатам и закрытому ключу.

volumes:
  - /etc/nginx/certs/:/etc/nginx/certs/

Когда контейнер nginx запускается и завершается с ошибкой со следующей ошибкой 

[emerg] 1#1: BIO_new_file("/etc/nginx/certs/fullchain.pem") failed 
(SSL: error:02001002:system library:fopen:No such file or 
directory:fopen('/etc/nginx/certs/fullchain.pem','r') 
error:2006D080:BIO routines:BIO_new_file:no such file)

Мой конфигурационный файл nginx выглядит так:

server {
    listen 80;
    server_name server_blah www.server_blah;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name server_blah;
    ssl_certificate      /etc/nginx/certs/fullchain.pem;
    ssl_certificate_key  /etc/nginx/certs/privkey.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
}

Что я пропускаю/делаю неправильно?

3
cathaldcronin1

Наконец-то взломали это и смогли успешно повторить процесс на моем сайте разработки и производства, чтобы заставить работать сертификаты SSL! 

Извините за длину поста!

В моей настройке у меня есть настройка docker docker-compose на машине с Ubuntu 16.

Любой, кто сталкивается с этой проблемой, я подробно опишу шаги, которые я сделал.

  1. Перейдите в каталог, где живет ваш код

    cd /opt/example_dir/

  2. Создайте каталог для letsencrypt и его сайта.

    Sudo mkdir -p /opt/example_dir/letsencrypt/letsencrypt-site

  3. Создайте barebones-файл docker-compose.yml из каталога letsencrypt.

    Sudo nano /opt/example_dir/letsencrypt/docker-compose.yml

Добавьте к этому следующее:

    version: '2'

        services:
            image: nginx:latest
            ports:
              - "80:80"
            volumes:
              - ./nginx.conf:/etc/nginx/conf.d/default.conf
              - ./letsencrypt-site:/usr/share/nginx/html
            networks:
              - docker-network

        networks:
          docker-network:
            driver: bridge

* This will pull down the latest nginx version
* Expose port 80 
* Mount a config file (that i'll create later) 
* Maps the site directory so that we can have a simple test index.html for when 

мы запускаем простой контейнер nginx.

  1. Создайте файл nginx.conf в /opt/example_dir/letsencrypt

    Sudo nano /opt/example_dir/letsencrypt/nginx.conf

Поместите в него следующее

    server {
      listen 80;
      listen [::]:80;
      server_name example_server.com;

      location ~ /.well-known/acme-challenge {
          allow all;
          root /usr/share/nginx/html;
      }

      root /usr/share/nginx/html;
      index index.html;
    }

* This listens for requests on port 80 for the server with name example_server.com
* Gives the Certbot agent access to ./well-known/acme-challenge
* Sets the default root and file
  1. Затем создайте файл index.html в /opt/example_dir/letsencrypt/letsencrypt-site

Sudo nano /opt/example_dir/letsencrypt/letsencrypt-site/index.html

Добавьте к этому следующее 

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>LetsEncrypt Setup</title>
</head>
<body>

    <p>Test file for our http nginx server</p>
</body>
</html>

#### Все детали на месте для базового контейнера nginx!

  1. Теперь мы запускаем контейнер nginx.

    cd /opt/example_dir/letsencrypt
    Sudo docker-compose up -d
    

Контейнер nginx запущен и работает, зайдите на URL, который вы определили, и вы должны вернуть тестовую страницу index.html. На данный момент мы готовы запустить команду certbot для генерации некоторых сертификатов.

  1. Выполните следующие действия, чтобы сгенерировать сертификаты, заменив --email вашим адресом электронной почты. 

    Sudo docker run -it --rm \
    -v /docker-volumes/etc/letsencrypt:/etc/letsencrypt \
    -v /docker-volumes/var/lib/letsencrypt:/var/lib/letsencrypt \
    -v /opt/example_dir/letsencrypt/letsencrypt-site:/data/letsencrypt \
    -v "/docker-volumes/var/log/letsencrypt:/var/log/letsencrypt" \
    certbot/certbot \
    certonly --webroot \
    --email [email protected] --agree-tos --no-eff-email \
    --webroot-path=/data/letsencrypt \
    -d example.com
    
    • Запустите Docker в интерактивном режиме, чтобы увидеть результат.
    • Когда он закончит генерировать сертификаты, он удалит себя.
    • Будет смонтировано 4 тома:
      1. Папка letsencrypt, где хранятся сертификаты /
      2. Папка lib
      3. Карты нашего сайта папка
      4. Карты путь регистрации 
    • Согласен с ToS
    • Определяет корневой веб-путь
    • Укажите адрес сервера, для которого вы хотите сгенерировать сертификаты.

Если эта команда выполняется нормально, мы создали сертификаты для этого веб-сервера. Теперь мы можем использовать их на нашем производственном сайте и настроить nginx для использования ssl и использовать эти сертификаты!

  1. Выключите контейнер nginx

    cd /opt/example_dir/letsencrypt/
    Sudo docker-compose down
    

Настройка производства контейнера nginx

Структура каталогов должна выглядеть следующим образом. Где у вас есть проект кода/веб-приложения, а затем папка letsencrypt, которую мы создали выше.

/opt/example_dir
             / -> project_folder
             / -> letsencrypt
  1. Создать папку вызова dh-param

    Sudo mkdir -p /opt/example_dir/project_folder/dh-param
    
  2. Сгенерировать ключ dh 

    Sudo openssl dhparam -out /opt/example_dir/project_folder/dh-param/dhparam-2048.pem 2048
    
  3. Обновите файлы docker-compose.yml и nginx.conf в /opt/example_dir/project_folder

В папке project_folder находится мой исходный код, поэтому я создаю здесь производственный конфигурационный файл для nginx и обновляю docker-compose.yml, чтобы смонтировать мою конфигурацию nginx, ключ обмена dh-pharam, а также сами сертификаты, которые мы создали ранее.

сервис nginx в docker-compose

    nginx:
        image: nginx:1.11.3
        restart: always
        ports:
          - "80:80"
          - "443:443"
          - "8000:8000"
        volumes:
          - ./nginx.conf:/etc/nginx/conf.d/default.conf
          - ./dh-param/dhparam-2048.pem:/etc/ssl/certs/dhparam-2048.pem
          - /docker-volumes/etc/letsencrypt/live/exampleserver.com/fullchain.pem:/etc/letsencrypt/live/exampleserver.com/fullchain.pem
          - /docker-volumes/etc/letsencrypt/live/exampleserver.com/privkey.pem:/etc/letsencrypt/live/exampleserver.com/privkey.pem
        networks:
          - docker-network

        volumes_from:
          - flask
        depends_on:
          - flask
          - falcon
        links:
          - datastore

nginx.conf в папке проекта

error_log /var/log/nginx/error.log warn;

server {
    listen 80;
    listen [::]:80;

    server_name exampleserver.com

    location / {
        rewrite ^ https://$Host$request_uri? permanent;
    }

    #for certbot challenges (renewal process)
    location ~ /.well-known/acme-challenge {
        allow all;
        root /data/letsencrypt;
    }
}

#https://exampleserver.com
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name exampleserver.com;

    server_tokens off;

    ssl_certificate /etc/letsencrypt/live/exampleserver.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/exampleserver.com/privkey.pem;

    ssl_buffer_size 8k;

    ssl_dhparam /etc/ssl/certs/dhparam-2048.pem;

    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
    ssl_prefer_server_ciphers on;

    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

    ssl_ecdh_curve secp384r1;
    ssl_session_tickets off;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8;


    # Define the specified charset to the “Content-Type” response header field
    charset utf-8;
}

На данный момент все настроено! (в конце концов)

  1. Раскрути док-контейнер. 

    cd /opt/example_dir/project_folder
    Sudo docker-compose up -d
    
    # Check the docker log with:
    Sudo docker logs -f -t  
    

Я знаю, что это много шагов, но это то, что я сделал, это сработало для меня, и надеюсь, что это поможет кому-то еще.

2
cathaldcronin1

У меня точно такая же проблема прямо сейчас. Те же коды ошибок.

Я пробовал разные вещи в моих файлах .pem:

  • Изменение разрешений (chmod) на:
    • 777
    • 755
    • 600
  • Смена владельца (chown) на:
    • nginx (пользователь определен в nginx.conf)
    • root
  • Изменение местоположения на:
    • / и т.д./SSL/сертификаты
    • / И т.д./Nginx/SSL
    • / И т.д./letsencrypt/жить
  • Изменение способа установки докера на:
    • ро (только для чтения)
    • rW (переписать)

К сожалению, ни одно из этих решений не помогло мне.

Похоже, что nginx не может найти файлы, даже если я могу их перечислить (ls) при подключении к контейнерному терминалу.

Для более подробной информации я использую Docker на NAS-устройстве Synology DS918 +.

Я надеюсь, что это поможет найти решение! Я буду экспериментировать и пробовать разные вещи, я вернусь, если мне удастся заставить это работать!

0
Kaybi