it-swarm.com.de

Hinzufügen von SSL-Zertifikaten zum NGINX-Docker-Container funktioniert nicht

Ich versuche, SSL-Zertifikate (erzeugt mit LetsEncrypt) zu meinem Nginx hinzuzufügen. Der Nginx wird aus einer Docker-Compose-Datei erstellt, in der ich ein Volume von meinem Host für den Container erstelle, sodass die Container auf die Zertifikate und den privaten Schlüssel zugreifen können.

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

Wenn der Nginx-Container startet und mit dem folgenden Fehler fehlschlägt 

[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)

Meine Nginx-Konfigurationsdatei sieht folgendermaßen aus:

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;
}

Was fehlt/tut ich falsch?

3
cathaldcronin1

Schließlich knackte dies und konnte den Vorgang auf meiner Entwicklungs- und Produktionsstätte erfolgreich wiederholen, um SSL-Zertifikate zum Laufen zu bringen! 

Sorry für die Länge des Beitrags!

In meinem Setup habe ich ein Docker-Docker-Compose-Setup auf einem Ubuntu 16-Rechner.

Jeder, der mit diesem Problem konfrontiert ist, werde die von mir ausgeführten Schritte detailliert beschreiben.

  1. Wechseln Sie in das Verzeichnis, in dem sich Ihr Code befindet

    cd /opt/example_dir/

  2. Erstellen Sie ein Verzeichnis für letsencrypt und dessen Site.

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

  3. Erstellen Sie die barebones docker-compose.yml-Datei aus dem Verzeichnis letsencrypt.

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

Fügen Sie Folgendes hinzu:

    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 

wir starten den einfachen Nginx-Container.

  1. Erstellen Sie eine nginx.conf-Datei in /opt/example_dir/letsencrypt

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

Fügen Sie folgendes ein

    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. Erstellen Sie als Nächstes eine index.html-Datei innerhalb von /opt/example_dir/letsencrypt/letsencrypt-site

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

Fügen Sie Folgendes hinzu 

<!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>

#### Alle Teile für den Basis-Nginx-Behälter vorhanden!

  1. Jetzt starten wir den Nginx-Container.

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

Der nginx-Container ist jetzt betriebsbereit. Besuchen Sie die von Ihnen definierte URL und Sie sollten die Seite test index.html zurückbekommen. An dieser Stelle können wir den certbot-Befehl ausführen, um einige Zertifikate zu generieren

  1. Führen Sie die folgenden Schritte aus, um Zertifikate zu generieren, die --email durch Ihre E-Mail ersetzen 

    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
    
    • Führen Sie das Andockfenster im interaktiven Modus aus, damit Sie die Ausgabe sehen können.
    • Wenn das Erstellen der Zertifikate abgeschlossen ist, wird es sich selbst entfernen.
    • Es werden 4 Volumes gemountet:
      1. Der letsencrypt-Ordner, in dem die Zertifikate gespeichert sind /
      2. Ein lib-Ordner
      3. Ordnet unseren Site-Ordner zu
      4. Ordnet einen Protokollierungspfad zu 
    • Sie stimmt ToS zu
    • Gibt den Stammpfad an
    • Geben Sie die Serveradresse an, für die Sie Zertifikate erstellen möchten.

Wenn dieser Befehl in Ordnung war, haben wir Zertifikate für diesen Webserver generiert. Wir können diese nun in unserer Produktionsstätte verwenden und nginx so konfigurieren, dass die SSL-Datei verwendet und diese Zertifikate verwendet werden!

  1. Fahren Sie den Nginx-Container herunter

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

Produktions-Nginx-Container einrichten

Die Verzeichnisstruktur sollte jetzt so aussehen. Wo haben Sie Ihr Code-/Web-App-Projekt und dann den oben erstellten letsencrypt-Ordner.

/opt/example_dir
             / -> project_folder
             / -> letsencrypt
  1. Erstellen Sie einen Ordneraufruf dh-param

    Sudo mkdir -p /opt/example_dir/project_folder/dh-param
    
  2. Erzeugen Sie einen Dh-Schlüssel 

    Sudo openssl dhparam -out /opt/example_dir/project_folder/dh-param/dhparam-2048.pem 2048
    
  3. Aktualisieren Sie die Dateien docker-compose.yml und nginx.conf in /opt/example_dir/project_folder.

Der Projektordner ist der Ort, an dem mein Quellcode gespeichert ist. Deshalb erstelle ich hier eine Produktionskonfigurationsdatei für nginx und aktualisiere die docker-compose.yml, um meine nginx config, dh-pharam exchange key sowie die zuvor erstellten Zertifikate zu mounten.

nginx-Dienst im 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 im Projektordner

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;
}

An diesem Punkt ist alles eingerichtet! (endlich)

  1. Drehen Sie den Docker-Container hoch. 

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

Ich weiß, es sind viele Schritte, aber das ist, was ich getan habe, es hat für mich funktioniert und ich hoffe, es hilft jemand anderem.

2
cathaldcronin1

Ich habe jetzt genau das gleiche Problem. Gleiche Fehlercodes.

Ich habe verschiedene Dinge in meinen .pem-Dateien versucht:

  • Ändern der Berechtigungen (chmod) in:
    • 777
    • 755
    • 600
  • Ändern des Besitzers (chown) in:
    • nginx (Benutzer definiert in nginx.conf)
    • root
  • Ändern Sie den Speicherort in:
    • / etc/ssl/certs
    • / etc/nginx/ssl
    • / etc/letsencrypt/live
  • Ändern der Docker-Montage in:
    • ro (readonly)
    • rw (readwrite)

Leider hat keine dieser Lösungen für mich funktioniert.

Es sieht wirklich so aus, als könnte Nginx die Dateien nicht finden, auch wenn ich sie auflisten kann (ls), wenn ich eine Verbindung zum Containerterminal herstelle.

Um mehr Details zu geben, verwende ich Docker auf einem Synology DS918 + NAS.

Ich hoffe, dass dies helfen wird, die Lösung zu finden! Ich werde experimentieren und verschiedene Dinge ausprobieren, ich werde wiederkommen, wenn mir das gelingt!

0
Kaybi