# HTTPS und Zertifikate

Für den produktiven Einsatz von Enginsight ist eine verschlüsselte Verbindung über HTTPS zwingend notwendig.

Dazu installieren und konfigurieren Sie nginx auf dem Applikationsserver. Bei der automatischen Installation von Enginsight ist nginx bereits installiert.

So erhalten Sie den folgenden Aufbau:

![](https://3532046264-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-LTMe1v0eboWCAUTQHbT-3758922206%2Fuploads%2FAPgVpJAogJru5sk7ddr9%2FmitHTTPS.png?alt=media\&token=3502dcde-9f41-488b-8d7d-8d788fc728a4)

* Container Ports: 80, 8080
* interne Ports: 81, 82 *(127.0.0.1:81, 127.0.0.1:82)*

Sie brauchen zwei Domains, die auf die IP-Adresse des Applikationsservers zeigen:

* ngs-api.domain.de (Port 80)
* ngs-app.domain.de (Port 443)

Wenn Sie ein eigenes Zertifikat besitzen, können Sie es nutzen. Alternativ empfehlen wir die Nutzung von Let's Encrypt.

## nginx installieren

{% hint style="info" %}
**Dieser Schritt ist nur bei manueller Installation notwendig!**\
Wenn Sie ein automatisiertes Setup verwenden, überspringen Sie diesen Abschnitt.
{% endhint %}

Haben Sie eine manuelle Installation durchgeführt, installieren Sie zunächst nginx. Bei einer automatischen Installation können Sie diesen Schritt überspringen.

```
sudo apt install nginx
```

## Interne Ports definieren

{% hint style="info" %}
**Dieser Schritt ist immer erforderlich, unabhängig von der Art der Installation.**\
Die Portdefinition ist essenziell für die interne Kommunikation der Dienste.
{% endhint %}

Defnieren Sie in der `docker-compose.yml` für die Benutzeroberfläche (ui-m1) und API (server-m2) einen internen Port.

1\. Navigieren Sie in /opt/enginsight/enterprise

```
cd /opt/enginsight/enterprise
```

2\. Öffnen Sie `docker-compose.yml`.

```
sudo nano docker-compose.yml
```

3\. Passen Sie die Ports an.

```
  ui-m1:
    image: registry.enginsight.com/enginsight/ui-m1:x.x.x
    ports:
    - "127.0.0.1:81:80"
    restart: always
    volumes:
    - "./conf/ui-m1/environment.js.production:/opt/enginsight/ui-m1/config/environment.js"

  server-m2:
    image: registry.enginsight.com/enginsight/server-m2:x.x.x
    networks:
    - redis
    - mongodb
    ports:
    - "127.0.0.1:82:8080"
```

4\. Speichern Sie die Datei (Strg+o) und bestätigen Sie den Speicherprozess. Schließen Sie nano (Strg+x).

5\. Führen Sie `setup.sh` aus, damit die Änderungen wirksam werden.

```
./setup.sh
```

## Let's Encrypt einrichten

{% hint style="info" %}
Wollen Sie ein eigenes Zertifikat nutzen, überspringen Sie die folgenden Schritte.
{% endhint %}

1. Passen Sie die Konfiguration von nginx an. Öffnen Sie die Konfigurationsdatei.

#### *Automatische Installation*

```
sudo nano /etc/nginx/sites-available/ngs.conf
```

#### *Manuelle Installation*

```
nano /etc/nginx/sites-available/default
```

2. Nutzen Sie die folgende Vorlage und setzen Sie Ihre Domain ein.

```
server {
        listen 80;
        listen [::]:80;
 
        location ~ /.well-known {
                allow all;
        }
 
        location / {
                return 302 https://ngs-api.domain;
        }
 
        root /var/www/ngs-api.domain;
 
        server_name ngs-api.domain;
}
 
server {
        listen 80;
        listen [::]:80;
 
        location ~ /.well-known {
                allow all;
        }
 
        location / {
                return 302 https://ngs-app.domain;
        }
 
        root /var/www/ngs-app.domain;
 
        server_name ngs-app.domain;
}
```

3. Rufen Sie den Status von nginx ab und prüfen Sie, ob die Änderung erfolgreich war.

```
sudo nginx -t
```

4. Starten Sie nginx neu.

```
sudo service nginx restart
```

5. Installieren Sie Certbot.

```
sudo apt-get install certbot
```

6. Legen Sie für jede Domain einen Ordner an.

```
sudo mkdir -p /var/www/ngs-api.domain.de
sudo mkdir -p /var/www/ngs-app.domain.de
```

7. Erstellen Sie das Zertifikat.

```
certbot certonly --rsa-key-size 4096 --webroot -w /var/www/ngs-api.domain.de -d ngs-api.domain.de
certbot certonly --rsa-key-size 4096 --webroot -w /var/www/ngs-app.domain.de -d ngs-app.domain.de
```

8. Generieren Sie die Diffie-Hellman Parameter.

```
sudo openssl dhparam -out dhparam.pem 2048
```

{% hint style="info" %}
Beachten Sie bitte, dass LetsEncrypt nur 3 Monate gültig ist. Folgen Sie der [Anleitung](https://knowledge.enginsight.com/schritt-f%C3%BCr-schritt-anleitung-zum-aktualisieren-eines-ssl-zertifikats-lets-encrypt), um Ihr SSL-Zertifikat zu aktualisieren.
{% endhint %}

## Zertifikate und SSL/TLS in nginx konfigurieren

### Mit Let's Encrypt

Passen Sie die Konfiguration von nginx an.

1\. Öffnen Sie die Konfigurationsdatei.

#### *Automatische Installation*

```
sudo nano /etc/nginx/sites-available/ngs.conf
```

#### *Manuelle Installation*

```
sudo nano /etc/nginx/sites-available/default
```

2\. Nutzen Sie die folgende Vorlage und setzen Sie Ihre Domain ein.

```
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}
server {
        listen 80;
        listen [::]:80;
 
        location ~ /.well-known {
                allow all;
        }
 
        location / {
                return 302 https://ngs-api.domain;
        }
 
        root /var/www/ngs-api.domain;
 
        server_name ngs-api.domain;
}
 
server {
        listen 80;
        listen [::]:80;
 
        location ~ /.well-known {
                allow all;
        }
 
        location / {
                return 302 https://ngs-app.domain;
        }
 
        root /var/www/ngs-app.domain;
 
        server_name ngs-app.domain;
}
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name ngs-app.domain.de;

    ssl_protocols TLSv1.2;
    ssl_prefer_server_ciphers on;
   ssl_ciphers "ECDHE+AESGCM+AES256";
    ssl_ecdh_curve secp384r1;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    ssl_dhparam /etc/nginx/dhparam.pem;
    ssl_certificate /etc/letsencrypt/live/ngs-app.domain.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ngs-app.domain.de/privkey.pem;

    client_max_body_size 200m;

    location / {
        proxy_pass http://127.0.0.1:81;
        proxy_set_header Host              $host;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-Proto "https";
        proxy_set_header X-Forwarded-Ssl   "on";
        proxy_set_header Upgrade           $http_upgrade;
        proxy_set_header Connection        $connection_upgrade;
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name ngs-api.domain.de;

    ssl_protocols TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "ECDHE+AESGCM+AES256";
    ssl_ecdh_curve secp384r1;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    ssl_dhparam /etc/nginx/dhparam.pem;
    ssl_certificate /etc/letsencrypt/live/ngs-api.domain.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ngs-api.domain.de/privkey.pem;

    client_max_body_size 200m;

    location / {
        proxy_pass http://127.0.0.1:82;
        proxy_set_header Host              $host;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-Proto "https";
        proxy_set_header X-Forwarded-Ssl   "on";
        proxy_set_header Upgrade           $http_upgrade;
        proxy_set_header Connection        $connection_upgrade;
    }
}
```

3\. Rufen Sie den Status von nginx ab und prüfen Sie, ob die Änderung erfolgreich war.

```
sudo nginx -t
```

4\. Starten Sie nginx neu.

```
sudo service nginx restart
```

5. **APP- und API-URL auf HTTPS umstellen**\
   Nachdem Sie nginx und das Zertifikat eingerichtet haben, führen Sie die `setup.sh` erneut aus. \
   Dabei werden die externen URLs für APP und API abgefragt. Tragen Sie hier die Domains mit `https://` ein (statt `http://`).<br>

   ```bash
   cd /opt/enginsight/enterprise
   sudo ./setup.sh
   ```

   Beispiel:

   * APP-URL: **`https`**`://ngs-app.domain.de`
   * API-URL: **`https`**`://ngs-api.domain.de`

   <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p>Dieser Schritt ist erforderlich, damit Enginsight die APP- und API-Endpunkte korrekt als HTTPS verwendet.<br>Wenn Sie versehentlich <code>http://</code> eintragen, bleibt die Instanz intern weiterhin auf HTTP konfiguriert, obwohl nginx bereits HTTPS bereitstellt.</p></div>

### Mit eigenem Zertifikat

{% hint style="warning" %}
Achten Sie beim Zertifikat bitte darauf, dass es im PEM Format vorliegt. Wenn nicht, konvertieren Sie das Zertifikat zunächst in das PEM Format.
{% endhint %}

Passen Sie die Konfiguration von nginx an.

1\. Öffnen Sie die Konfigurationsdatei.

*Automatische Installation*

```
sudo nano /etc/nginx/sites-available/ngs.conf
```

*Manuelle Installation*

```
sudo nano /etc/nginx/sites-available/default
```

2\. Nutzen Sie die folgende Vorlage und setzen Sie Ihre Domain und die Pfade zu den Zertifikaten ein.

```
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name ngs-app.domain.de;

    ssl_protocols TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "ECDHE+AESGCM+AES256";
    ssl_ecdh_curve secp384r1;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

#   ssl_dhparam /etc/nginx/dhparam.pem;
    ssl_certificate /<Pfad>/fullchain.pem;
    ssl_certificate_key /<Pfad>/privkey.pem;

    client_max_body_size 200m;

    location / {
        proxy_pass http://127.0.0.1:81;
        proxy_set_header Host              $host;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-Proto "https";
        proxy_set_header X-Forwarded-Ssl   "on";
        proxy_set_header Upgrade           $http_upgrade;
        proxy_set_header Connection        $connection_upgrade;
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name ngs-api.domain.de;

    ssl_protocols TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "ECDHE+AESGCM+AES256";
    ssl_ecdh_curve secp384r1;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

#   ssl_dhparam /etc/nginx/dhparam.pem;
    ssl_certificate /<Pfad>/fullchain.pem;
    ssl_certificate_key /<Pfad>/privkey.pem;

    client_max_body_size 200m;

    location / {
        proxy_pass http://127.0.0.1:82;
        proxy_set_header Host              $host;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-Proto "https";
        proxy_set_header X-Forwarded-Ssl   "on";
        proxy_set_header Upgrade           $http_upgrade;
        proxy_set_header Connection        $connection_upgrade;
    }
}
```

3\. Rufen Sie den Status von nginx ab und prüfen Sie, ob die Änderung erfolgreich war.

<pre><code><strong>sudo nginx -t
</strong></code></pre>

4\. Starten Sie nginx neu.

<pre><code><strong>sudo service nginx restart
</strong></code></pre>

5. **APP- und API-URL auf HTTPS umstellen**\
   Nachdem Sie nginx und das Zertifikat eingerichtet haben, führen Sie die `setup.sh` erneut aus. \
   Dabei werden die externen URLs für APP und API abgefragt. Tragen Sie hier die Domains mit `https://` ein (statt `http://`).<br>

   ```bash
   cd /opt/enginsight/enterprise
   sudo ./setup.sh
   ```

   Beispiel:

   * APP-URL: **`https`**`://ngs-app.domain.de`
   * API-URL: **`https`**`://ngs-api.domain.de`

   <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p>Dieser Schritt ist erforderlich, damit Enginsight die APP- und API-Endpunkte korrekt als HTTPS verwendet.<br>Wenn Sie versehentlich <code>http://</code> eintragen, bleibt die Instanz intern weiterhin auf HTTP konfiguriert, obwohl nginx bereits HTTPS bereitstellt.</p></div>
