<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Andremotz</id>
	<title>FHEMWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.fhem.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Andremotz"/>
	<link rel="alternate" type="text/html" href="http://wiki.fhem.de/wiki/Spezial:Beitr%C3%A4ge/Andremotz"/>
	<updated>2026-04-11T02:17:50Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver&amp;diff=23087</id>
		<title>HTTPS-Absicherung &amp; Authentifizierung via nginx Webserver</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver&amp;diff=23087"/>
		<updated>2017-10-29T10:35:55Z</updated>

		<summary type="html">&lt;p&gt;Andremotz: Bekannte Fehlerquellen hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ähnlich wie im Artikel [[Apache Authentication Proxy]] kann FHEM auch mit dem schlankeren nginx Webserver abgesichert werden. Nach diesem Artikel ist die Kommunikation zum FHEM-Server via HTTPS verschlüsselt und eine Authentifizierung nur via Benutzername und Passwort möglich. Externer Zugriff aus dem eigenen Netzwerk/Internet soll damit unterbunden werden; die Kommunikation und Authentifizierung findet verschlüsselt statt.&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Vorausgesetzt wird eine funktionierende FHEM Installation. Die dadurch erbrachten Linux Kenntnisse reichen für die Umsetzung dieses Artikels. Weiterführende Links zu Zertifikaten und dem nginx-Webserver befinden sich im Anhang des Artikels.&lt;br /&gt;
&lt;br /&gt;
Ausgegangen wird von einer FHEM-Installation, die auf Port 8083 via HTTP hört. Dieser Port wird abgesichert, indem er nur noch lokal und nicht mehr über das Netzwerk erreichbar ist. Anfragen auf Port 80 (HTTP, nginx) werden weitergeleitet zum lokalen Port 443 (HTTPS, nginx), der wiederum einen Reverse Proxy auf den Port 8083 (HTTPS, fhem) einrichtet. Mit leichten Modifizierungen könnte nginx auch auf einem separaten Server betrieben werden. Die benötigten Zertifikate für die HTTPS Verschlüsselung können eigenhändig angelegt werden. Der/die autorisierten Benutzer werden in einer verschlüsselten Datei hinterlegt, die nginx für die Authentifizierung benutzt.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das Setup auf einem Raspberry Pi (Raspbian - basierend auf Debian 8 und 9) und fhem 5.7 bzw. fhem 5.8. Die beschriebenen Befehle sollten sich ohne weiteres auf Ubuntu oder andere Debian-Derivate übertragen lassen. Das beschriebene Konzept lässt sich aber auf jedes Unix-Derivat anwenden.&lt;br /&gt;
&lt;br /&gt;
==Anpassungen: fhem-Config==&lt;br /&gt;
In der FHEM-Konfiguration muss sichergestellt werden, dass kein Client außerhalb des Servers zugreifen kann. Dazu muss das normalerweise gesetzte Flag global von jeglicher Konfiguration entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Beispielkonfiguration:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
# define telnetPort telnet 7072 global&lt;br /&gt;
&lt;br /&gt;
define WEB FHEMWEB 8083&lt;br /&gt;
attr WEB stylesheetPrefix dark&lt;br /&gt;
# attr WEB HTTPS&lt;br /&gt;
&lt;br /&gt;
# define WEBhomebridge FHEMWEB 8084&lt;br /&gt;
# attr WEBphone stylesheetPrefix smallscreen&lt;br /&gt;
&lt;br /&gt;
# define WEBtablet FHEMWEB 8085 global&lt;br /&gt;
# attr WEBtablet stylesheetPrefix touchpad&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
fhem neustarten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; $ sudo service fhem stop &amp;amp;&amp;amp; sudo service fhem start &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation: nginx als reverse Proxy ==&lt;br /&gt;
nginx installieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo apt-get install nginx &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach im Pfad &#039;&#039;&#039;/etc/nginx/sites-available&#039;&#039;&#039; eine neue Proxy Konfiguration anlegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo touch /etc/nginx/sites-available/reverse-proxy&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Inhalt der Datei &#039;&#039;&#039;reverse-proxy&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
&lt;br /&gt;
    listen 443;&lt;br /&gt;
    server_name fhempi;&lt;br /&gt;
&lt;br /&gt;
    ssl_certificate           /etc/nginx/cert.crt;&lt;br /&gt;
    ssl_certificate_key       /etc/nginx/cert.key;&lt;br /&gt;
&lt;br /&gt;
    ssl on;&lt;br /&gt;
    ssl_session_cache  builtin:1000  shared:SSL:10m;&lt;br /&gt;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;&lt;br /&gt;
    ssl_prefer_server_ciphers on;&lt;br /&gt;
&lt;br /&gt;
    access_log            /var/log/nginx/jenkins.access.log;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
&lt;br /&gt;
      proxy_set_header        Host $host;&lt;br /&gt;
      proxy_set_header        X-Real-IP $remote_addr;&lt;br /&gt;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
      proxy_set_header        X-Forwarded-Proto $scheme;&lt;br /&gt;
      proxy_http_version      1.1;&lt;br /&gt;
&lt;br /&gt;
      proxy_pass          http://localhost:8083;&lt;br /&gt;
      proxy_read_timeout  90;&lt;br /&gt;
      #proxy_read_timeout  20736000;&lt;br /&gt;
      #proxy_buffering     off;&lt;br /&gt;
&lt;br /&gt;
      # User Sickboy&#039;s Erweiterung für verschlüsselte Websocket-Kommunikation (siehe Diskussionsseite)&lt;br /&gt;
      # Für normale Benutzer derzeit kommentiert, vom Autor Andremotz noch bisher ungetestet&lt;br /&gt;
      #  ... daher derzeit auskommentiert&lt;br /&gt;
      #if ($http_upgrade = &amp;quot;websocket&amp;quot;) {&lt;br /&gt;
      #  set $my_http_upgrade $http_upgrade;&lt;br /&gt;
      #  set $my_connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
      #}&lt;br /&gt;
&lt;br /&gt;
      auth_basic &amp;quot;Restricted Content&amp;quot;;&lt;br /&gt;
      auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
      # proxy_redirect      http://localhost:8083 https://localhost;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit dieser Konfiguration werden zwei Server-Instanzen auf Port 80 und Port 443 angelegt. Surft ein Browser/eine App Port 80 an, wird er umgehend zum verschlüsselten Port 443 weitergeleitet. Die Zertifikate befinden sich im lokalen Verzeichnis unter /etc/nginx und verschlüsselt wird via TLS.&lt;br /&gt;
&lt;br /&gt;
Nginx&#039; Default-Konfiguration muss noch deaktiviert und die Reverse-Proxy-Einstellungen verlinkt werden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo unlink /etc/nginx/sites-enabled/default&lt;br /&gt;
$ sudo ln -s /etc/nginx/sites-available/reverse-proxy /etc/nginx/sites-enabled/reverse-proxy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Ein User hatte für mich nicht nachvollziehbare Probleme und empfiehlt folgende Settings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
   proxy_read_timeout  2073600;&lt;br /&gt;
   proxy_buffering off;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User anlegen für Authentifizierung ==&lt;br /&gt;
Der Username und das verschlüsselte Passwort werden mit den folgenden Kommandos in die Datei ’’ ’/etc/nginx/.htpasswd’’’ geschrieben, das nginx in der Konfiguration für die User-Authentifizierung benutzt.&lt;br /&gt;
&lt;br /&gt;
Username &#039;&#039;&#039;maxmustermann&#039;&#039;&#039; anlegen (Doppelpunkt nach Username nicht übersehen!):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo sh -c &amp;quot;echo -n &#039;maxmustermann:&#039; &amp;gt;&amp;gt; /etc/nginx/.htpasswd&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Passwort-Prompt aufrufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo sh -c &amp;quot;openssl passwd -apr1 &amp;gt;&amp;gt; /etc/nginx/.htpasswd&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zertifikatserstellung == &lt;br /&gt;
Erst durch die Zertifikate ist eine verschlüsselte Kommunikation zwischen Browser und nginx möglich&lt;br /&gt;
Beide beschriebenen Optionen sind dabei gleichermaßen sicher. Damit allerdings nicht jedes ausgestelle Zertifikat vertraut wird, gibt es das Konzept der Certificate Authorities (&#039;CA&#039;, näheres siehe Links). Jeder gängige Browser warnt den Benutzer vor einem Zertifikat, das von keiner Thrusted Authority ausgestellt wurde, bietet jedoch dem Benutzer die Möglichkeit, trotzdem fortzufahren. Durch die Tatsache, dass das Zertifikat selbst erstellt und signiert wird, kann diese Warnung im Browser später getrost umgangen werden. &lt;br /&gt;
&lt;br /&gt;
Selbst signiertes Zertifikat erstellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dabei werden für die Erstellung ein paar Angaben abgefragt. Wichtig ist dabei der Common Name, der identisch mit der später verwendeten Domain oder öffentliche IP-Adresse sein muss.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Country Name (2 letter code) [AU]:AT&lt;br /&gt;
State or Province Name (full name) [Some-State]:Vienna&lt;br /&gt;
Locality Name (eg, city) []:Vienna&lt;br /&gt;
Organization Name (eg, company) []:privat&lt;br /&gt;
Organizational Unit Name (eg, section) []:privat&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:meine_domain_oder_ip&lt;br /&gt;
Email Address []:admin@meinedomain&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nginx neustarten, um die Änderungen und das Zertifikat zu übernehmen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo service nginx reload &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der folgende Aufruf sollten bereits eingerichteten FHEM-Server via Passwort-Abfrage und HTTPS absichern:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;fhemserver&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Bekannte Fehlerquellen ==&lt;br /&gt;
=== Beim Aufruf http://&amp;lt;fhempi&amp;gt; wird nur eine &amp;quot;Wilkommen bei nginx&amp;quot;-Seite angezeigt, statt der erwartete Login-Screen ===&lt;br /&gt;
Nach einer Neuinstallation dem Autor selber passiert. Fehler war, dass die nginx-Default-Konfiuguration noch aktiv war. Der Link zur Default-Konfiguration muss entfernt werden, bzw. gleich komplett gelöscht werden&lt;br /&gt;
&lt;br /&gt;
=== Wenn ich mich einlogge, bekomme ich nur einen 500 internal Server error. Ich habe garantiert alles richtig konfiguriert! ===&lt;br /&gt;
Ebenfalls dem Autor nach einer Neuinstallation passiert: Fehler war, dass das Passwort durch einen Copy &amp;amp; Paste-Fehler falsch eingetragen wurde. Der Fehlerfall kann umgangen werden, indem zuerst die .htpasswd-Datei gelöscht wird und der User und ein simples Passwort neu angelegt werden. Danach mit einer neuen Browser-Session Fhem ansurfen (am besten Firefox im Privat-Modus, damit sämtliche Cookies &amp;amp; sonstiges Buffering umgangen wird)&lt;br /&gt;
&lt;br /&gt;
== Quellen &amp;amp; weiterführende Links ==&lt;br /&gt;
* [https://www.digitalocean.com/community/tutorials/how-to-create-an-ssl-certificate-on-nginx-for-ubuntu-14-04 How To Create an SSL Certificate on Nginx for Ubuntu 14.04]&lt;br /&gt;
* [https://linuxconfig.org/setting-up-nginx-reverse-proxy-server-on-debian-linux Setting up Nginx Reverse Proxy server on Debian Linux]&lt;br /&gt;
* [https://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-nginx-on-ubuntu-14-04 How To Set Up Password Authentication with Nginx on Ubuntu 14.04]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol_Secure Wikipedia: HTTPS]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Transport_Layer_Security Wikipedia: TLS]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Andremotz</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver&amp;diff=23086</id>
		<title>HTTPS-Absicherung &amp; Authentifizierung via nginx Webserver</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver&amp;diff=23086"/>
		<updated>2017-10-29T10:27:52Z</updated>

		<summary type="html">&lt;p&gt;Andremotz: Sickboy&amp;#039;s websocket-Kommunikation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ähnlich wie im Artikel [[Apache Authentication Proxy]] kann FHEM auch mit dem schlankeren nginx Webserver abgesichert werden. Nach diesem Artikel ist die Kommunikation zum FHEM-Server via HTTPS verschlüsselt und eine Authentifizierung nur via Benutzername und Passwort möglich. Externer Zugriff aus dem eigenen Netzwerk/Internet soll damit unterbunden werden; die Kommunikation und Authentifizierung findet verschlüsselt statt.&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Vorausgesetzt wird eine funktionierende FHEM Installation. Die dadurch erbrachten Linux Kenntnisse reichen für die Umsetzung dieses Artikels. Weiterführende Links zu Zertifikaten und dem nginx-Webserver befinden sich im Anhang des Artikels.&lt;br /&gt;
&lt;br /&gt;
Ausgegangen wird von einer FHEM-Installation, die auf Port 8083 via HTTP hört. Dieser Port wird abgesichert, indem er nur noch lokal und nicht mehr über das Netzwerk erreichbar ist. Anfragen auf Port 80 (HTTP, nginx) werden weitergeleitet zum lokalen Port 443 (HTTPS, nginx), der wiederum einen Reverse Proxy auf den Port 8083 (HTTPS, fhem) einrichtet. Mit leichten Modifizierungen könnte nginx auch auf einem separaten Server betrieben werden. Die benötigten Zertifikate für die HTTPS Verschlüsselung können eigenhändig angelegt werden. Der/die autorisierten Benutzer werden in einer verschlüsselten Datei hinterlegt, die nginx für die Authentifizierung benutzt.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das Setup auf einem Raspberry Pi (Raspbian - basierend auf Debian 8 und 9) und fhem 5.7 bzw. fhem 5.8. Die beschriebenen Befehle sollten sich ohne weiteres auf Ubuntu oder andere Debian-Derivate übertragen lassen. Das beschriebene Konzept lässt sich aber auf jedes Unix-Derivat anwenden.&lt;br /&gt;
&lt;br /&gt;
==Anpassungen: fhem-Config==&lt;br /&gt;
In der FHEM-Konfiguration muss sichergestellt werden, dass kein Client außerhalb des Servers zugreifen kann. Dazu muss das normalerweise gesetzte Flag global von jeglicher Konfiguration entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Beispielkonfiguration:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
# define telnetPort telnet 7072 global&lt;br /&gt;
&lt;br /&gt;
define WEB FHEMWEB 8083&lt;br /&gt;
attr WEB stylesheetPrefix dark&lt;br /&gt;
# attr WEB HTTPS&lt;br /&gt;
&lt;br /&gt;
# define WEBhomebridge FHEMWEB 8084&lt;br /&gt;
# attr WEBphone stylesheetPrefix smallscreen&lt;br /&gt;
&lt;br /&gt;
# define WEBtablet FHEMWEB 8085 global&lt;br /&gt;
# attr WEBtablet stylesheetPrefix touchpad&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
fhem neustarten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; $ sudo service fhem stop &amp;amp;&amp;amp; sudo service fhem start &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation: nginx als reverse Proxy ==&lt;br /&gt;
nginx installieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo apt-get install nginx &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach im Pfad &#039;&#039;&#039;/etc/nginx/sites-available&#039;&#039;&#039; eine neue Proxy Konfiguration anlegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo touch /etc/nginx/sites-available/reverse-proxy&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Inhalt der Datei &#039;&#039;&#039;reverse-proxy&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
&lt;br /&gt;
    listen 443;&lt;br /&gt;
    server_name fhempi;&lt;br /&gt;
&lt;br /&gt;
    ssl_certificate           /etc/nginx/cert.crt;&lt;br /&gt;
    ssl_certificate_key       /etc/nginx/cert.key;&lt;br /&gt;
&lt;br /&gt;
    ssl on;&lt;br /&gt;
    ssl_session_cache  builtin:1000  shared:SSL:10m;&lt;br /&gt;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;&lt;br /&gt;
    ssl_prefer_server_ciphers on;&lt;br /&gt;
&lt;br /&gt;
    access_log            /var/log/nginx/jenkins.access.log;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
&lt;br /&gt;
      proxy_set_header        Host $host;&lt;br /&gt;
      proxy_set_header        X-Real-IP $remote_addr;&lt;br /&gt;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
      proxy_set_header        X-Forwarded-Proto $scheme;&lt;br /&gt;
      proxy_http_version      1.1;&lt;br /&gt;
&lt;br /&gt;
      proxy_pass          http://localhost:8083;&lt;br /&gt;
      proxy_read_timeout  90;&lt;br /&gt;
      #proxy_read_timeout  20736000;&lt;br /&gt;
      #proxy_buffering     off;&lt;br /&gt;
&lt;br /&gt;
      # User Sickboy&#039;s Erweiterung für verschlüsselte Websocket-Kommunikation (siehe Diskussionsseite)&lt;br /&gt;
      # Für normale Benutzer derzeit kommentiert, vom Autor Andremotz noch bisher ungetestet&lt;br /&gt;
      #  ... daher derzeit auskommentiert&lt;br /&gt;
      #if ($http_upgrade = &amp;quot;websocket&amp;quot;) {&lt;br /&gt;
      #  set $my_http_upgrade $http_upgrade;&lt;br /&gt;
      #  set $my_connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
      #}&lt;br /&gt;
&lt;br /&gt;
      auth_basic &amp;quot;Restricted Content&amp;quot;;&lt;br /&gt;
      auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
      # proxy_redirect      http://localhost:8083 https://localhost;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit dieser Konfiguration werden zwei Server-Instanzen auf Port 80 und Port 443 angelegt. Surft ein Browser/eine App Port 80 an, wird er umgehend zum verschlüsselten Port 443 weitergeleitet. Die Zertifikate befinden sich im lokalen Verzeichnis unter /etc/nginx und verschlüsselt wird via TLS.&lt;br /&gt;
&lt;br /&gt;
Nginx&#039; Default-Konfiguration muss noch deaktiviert und die Reverse-Proxy-Einstellungen verlinkt werden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo unlink /etc/nginx/sites-enabled/default&lt;br /&gt;
$ sudo ln -s /etc/nginx/sites-available/reverse-proxy /etc/nginx/sites-enabled/reverse-proxy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Ein User hatte für mich nicht nachvollziehbare Probleme und empfiehlt folgende Settings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
   proxy_read_timeout  2073600;&lt;br /&gt;
   proxy_buffering off;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User anlegen für Authentifizierung ==&lt;br /&gt;
Der Username und das verschlüsselte Passwort werden mit den folgenden Kommandos in die Datei ’’ ’/etc/nginx/.htpasswd’’’ geschrieben, das nginx in der Konfiguration für die User-Authentifizierung benutzt.&lt;br /&gt;
&lt;br /&gt;
Username &#039;&#039;&#039;maxmustermann&#039;&#039;&#039; anlegen (Doppelpunkt nach Username nicht übersehen!):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo sh -c &amp;quot;echo -n &#039;maxmustermann:&#039; &amp;gt;&amp;gt; /etc/nginx/.htpasswd&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Passwort-Prompt aufrufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo sh -c &amp;quot;openssl passwd -apr1 &amp;gt;&amp;gt; /etc/nginx/.htpasswd&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zertifikatserstellung == &lt;br /&gt;
Erst durch die Zertifikate ist eine verschlüsselte Kommunikation zwischen Browser und nginx möglich&lt;br /&gt;
Beide beschriebenen Optionen sind dabei gleichermaßen sicher. Damit allerdings nicht jedes ausgestelle Zertifikat vertraut wird, gibt es das Konzept der Certificate Authorities (&#039;CA&#039;, näheres siehe Links). Jeder gängige Browser warnt den Benutzer vor einem Zertifikat, das von keiner Thrusted Authority ausgestellt wurde, bietet jedoch dem Benutzer die Möglichkeit, trotzdem fortzufahren. Durch die Tatsache, dass das Zertifikat selbst erstellt und signiert wird, kann diese Warnung im Browser später getrost umgangen werden. &lt;br /&gt;
&lt;br /&gt;
Selbst signiertes Zertifikat erstellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dabei werden für die Erstellung ein paar Angaben abgefragt. Wichtig ist dabei der Common Name, der identisch mit der später verwendeten Domain oder öffentliche IP-Adresse sein muss.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Country Name (2 letter code) [AU]:AT&lt;br /&gt;
State or Province Name (full name) [Some-State]:Vienna&lt;br /&gt;
Locality Name (eg, city) []:Vienna&lt;br /&gt;
Organization Name (eg, company) []:privat&lt;br /&gt;
Organizational Unit Name (eg, section) []:privat&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:meine_domain_oder_ip&lt;br /&gt;
Email Address []:admin@meinedomain&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nginx neustarten, um die Änderungen und das Zertifikat zu übernehmen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo service nginx reload &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der folgende Aufruf sollten bereits eingerichteten FHEM-Server via Passwort-Abfrage und HTTPS absichern:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;fhemserver&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen &amp;amp; weiterführende Links ==&lt;br /&gt;
* [https://www.digitalocean.com/community/tutorials/how-to-create-an-ssl-certificate-on-nginx-for-ubuntu-14-04 How To Create an SSL Certificate on Nginx for Ubuntu 14.04]&lt;br /&gt;
* [https://linuxconfig.org/setting-up-nginx-reverse-proxy-server-on-debian-linux Setting up Nginx Reverse Proxy server on Debian Linux]&lt;br /&gt;
* [https://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-nginx-on-ubuntu-14-04 How To Set Up Password Authentication with Nginx on Ubuntu 14.04]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol_Secure Wikipedia: HTTPS]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Transport_Layer_Security Wikipedia: TLS]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Andremotz</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=Diskussion:HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver&amp;diff=23085</id>
		<title>Diskussion:HTTPS-Absicherung &amp; Authentifizierung via nginx Webserver</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=Diskussion:HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver&amp;diff=23085"/>
		<updated>2017-10-29T10:22:15Z</updated>

		<summary type="html">&lt;p&gt;Andremotz: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Websocket ==&lt;br /&gt;
&lt;br /&gt;
Ich würde gerne die Anleitung um den Punkt Websocket Konfiguration erweitern, möchte das aber gerne vorher abstimmen.&lt;br /&gt;
&lt;br /&gt;
Die gezeigte Konfiguration erlaubt es aktuell nicht das das Webfrontend websockets nutzt. Basierend auf dem Foren Eintrag https://forum.fhem.de/index.php/topic,67220.msg587019.html#msg587019 habe ich folgende Konfiguration erstellt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
&lt;br /&gt;
    listen 443;&lt;br /&gt;
    server_name fhempi;&lt;br /&gt;
&lt;br /&gt;
    ssl_certificate           /etc/nginx/cert.crt;&lt;br /&gt;
    ssl_certificate_key       /etc/nginx/cert.key;&lt;br /&gt;
&lt;br /&gt;
    ssl on;&lt;br /&gt;
    ssl_session_cache  builtin:1000  shared:SSL:10m;&lt;br /&gt;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;&lt;br /&gt;
    ssl_prefer_server_ciphers on;&lt;br /&gt;
&lt;br /&gt;
    access_log            /var/log/nginx/fhem.access.log;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
&lt;br /&gt;
      set $my_http_upgrade &amp;quot;&amp;quot;;&lt;br /&gt;
      set $my_connection &amp;quot;Connection&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      proxy_set_header        Host $host;&lt;br /&gt;
      proxy_set_header        X-Real-IP $remote_addr;&lt;br /&gt;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
      proxy_set_header        X-Forwarded-Proto $scheme;&lt;br /&gt;
      proxy_http_version      1.1;&lt;br /&gt;
&lt;br /&gt;
      if ($http_upgrade = &amp;quot;websocket&amp;quot;) {&lt;br /&gt;
        set $my_http_upgrade $http_upgrade;&lt;br /&gt;
        set $my_connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
      proxy_set_header Upgrade $my_http_upgrade;&lt;br /&gt;
      proxy_set_header Connection $my_connection;&lt;br /&gt;
&lt;br /&gt;
      proxy_pass          http://localhost:8083;&lt;br /&gt;
      #proxy_read_timeout  20736000;&lt;br /&gt;
      #proxy_buffering     off;&lt;br /&gt;
&lt;br /&gt;
      auth_basic &amp;quot;Restricted Content&amp;quot;;&lt;br /&gt;
      auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
      # proxy_redirect      http://localhost:8083 https://localhost;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Sickboy|Sickboy]] ([[Benutzer Diskussion:Sickboy|Diskussion]]) 16:57, 28. Apr. 2017 (CEST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hi Sickboy!&lt;br /&gt;
Danke für deine Anregung! Sorry für die späte Antwort ;-)&lt;br /&gt;
&lt;br /&gt;
Ich baue dein Websocket-Beispiel in die Vorzeige-Cfg ein und kommentiere sie aber erstmal. Klingt wirklich vielversprechend und ich werde das demnächst mal testen.&lt;br /&gt;
&lt;br /&gt;
--[[Benutzer:Andremotz|Andremotz]] ([[Benutzer Diskussion:Andremotz|Diskussion]]) 11:22, 29. Okt. 2017 (CET)&lt;/div&gt;</summary>
		<author><name>Andremotz</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver&amp;diff=23084</id>
		<title>HTTPS-Absicherung &amp; Authentifizierung via nginx Webserver</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver&amp;diff=23084"/>
		<updated>2017-10-29T10:17:42Z</updated>

		<summary type="html">&lt;p&gt;Andremotz: Updates nach Neuinstallation, Fhem 5.8, Hinweis auf nginx-config Verlinkung in sites-enabled/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ähnlich wie im Artikel [[Apache Authentication Proxy]] kann FHEM auch mit dem schlankeren nginx Webserver abgesichert werden. Nach diesem Artikel ist die Kommunikation zum FHEM-Server via HTTPS verschlüsselt und eine Authentifizierung nur via Benutzername und Passwort möglich. Externer Zugriff aus dem eigenen Netzwerk/Internet soll damit unterbunden werden; die Kommunikation und Authentifizierung findet verschlüsselt statt.&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Vorausgesetzt wird eine funktionierende FHEM Installation. Die dadurch erbrachten Linux Kenntnisse reichen für die Umsetzung dieses Artikels. Weiterführende Links zu Zertifikaten und dem nginx-Webserver befinden sich im Anhang des Artikels.&lt;br /&gt;
&lt;br /&gt;
Ausgegangen wird von einer FHEM-Installation, die auf Port 8083 via HTTP hört. Dieser Port wird abgesichert, indem er nur noch lokal und nicht mehr über das Netzwerk erreichbar ist. Anfragen auf Port 80 (HTTP, nginx) werden weitergeleitet zum lokalen Port 443 (HTTPS, nginx), der wiederum einen Reverse Proxy auf den Port 8083 (HTTPS, fhem) einrichtet. Mit leichten Modifizierungen könnte nginx auch auf einem separaten Server betrieben werden. Die benötigten Zertifikate für die HTTPS Verschlüsselung können eigenhändig angelegt werden. Der/die autorisierten Benutzer werden in einer verschlüsselten Datei hinterlegt, die nginx für die Authentifizierung benutzt.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das Setup auf einem Raspberry Pi (Raspbian - basierend auf Debian 8 und 9) und fhem 5.7 bzw. fhem 5.8. Die beschriebenen Befehle sollten sich ohne weiteres auf Ubuntu oder andere Debian-Derivate übertragen lassen. Das beschriebene Konzept lässt sich aber auf jedes Unix-Derivat anwenden.&lt;br /&gt;
&lt;br /&gt;
==Anpassungen: fhem-Config==&lt;br /&gt;
In der FHEM-Konfiguration muss sichergestellt werden, dass kein Client außerhalb des Servers zugreifen kann. Dazu muss das normalerweise gesetzte Flag global von jeglicher Konfiguration entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Beispielkonfiguration:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
# define telnetPort telnet 7072 global&lt;br /&gt;
&lt;br /&gt;
define WEB FHEMWEB 8083&lt;br /&gt;
attr WEB stylesheetPrefix dark&lt;br /&gt;
# attr WEB HTTPS&lt;br /&gt;
&lt;br /&gt;
# define WEBhomebridge FHEMWEB 8084&lt;br /&gt;
# attr WEBphone stylesheetPrefix smallscreen&lt;br /&gt;
&lt;br /&gt;
# define WEBtablet FHEMWEB 8085 global&lt;br /&gt;
# attr WEBtablet stylesheetPrefix touchpad&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
fhem neustarten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; $ sudo service fhem stop &amp;amp;&amp;amp; sudo service fhem start &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation: nginx als reverse Proxy ==&lt;br /&gt;
nginx installieren:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo apt-get install nginx &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach im Pfad &#039;&#039;&#039;/etc/nginx/sites-available&#039;&#039;&#039; eine neue Proxy Konfiguration anlegen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo touch /etc/nginx/sites-available/reverse-proxy&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Inhalt der Datei &#039;&#039;&#039;reverse-proxy&#039;&#039;&#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
&lt;br /&gt;
    listen 443;&lt;br /&gt;
    server_name fhempi;&lt;br /&gt;
&lt;br /&gt;
    ssl_certificate           /etc/nginx/cert.crt;&lt;br /&gt;
    ssl_certificate_key       /etc/nginx/cert.key;&lt;br /&gt;
&lt;br /&gt;
    ssl on;&lt;br /&gt;
    ssl_session_cache  builtin:1000  shared:SSL:10m;&lt;br /&gt;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;&lt;br /&gt;
    ssl_prefer_server_ciphers on;&lt;br /&gt;
&lt;br /&gt;
    access_log            /var/log/nginx/jenkins.access.log;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
&lt;br /&gt;
      proxy_set_header        Host $host;&lt;br /&gt;
      proxy_set_header        X-Real-IP $remote_addr;&lt;br /&gt;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
      proxy_set_header        X-Forwarded-Proto $scheme;&lt;br /&gt;
&lt;br /&gt;
      proxy_pass          http://localhost:8083;&lt;br /&gt;
      proxy_read_timeout  90;&lt;br /&gt;
&lt;br /&gt;
        auth_basic &amp;quot;Restricted Content&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
      # proxy_redirect      http://localhost:8083 https://localhost;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Mit dieser Konfiguration werden zwei Server-Instanzen auf Port 80 und Port 443 angelegt. Surft ein Browser/eine App Port 80 an, wird er umgehend zum verschlüsselten Port 443 weitergeleitet. Die Zertifikate befinden sich im lokalen Verzeichnis unter /etc/nginx und verschlüsselt wird via TLS.&lt;br /&gt;
&lt;br /&gt;
Nginx&#039; Default-Konfiguration muss noch deaktiviert und die Reverse-Proxy-Einstellungen verlinkt werden&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ sudo unlink /etc/nginx/sites-enabled/default&lt;br /&gt;
$ sudo ln -s /etc/nginx/sites-available/reverse-proxy /etc/nginx/sites-enabled/reverse-proxy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis: Ein User hatte für mich nicht nachvollziehbare Probleme und empfiehlt folgende Settings:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;go&amp;quot;&amp;gt;&lt;br /&gt;
   proxy_read_timeout  2073600;&lt;br /&gt;
   proxy_buffering off;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User anlegen für Authentifizierung ==&lt;br /&gt;
Der Username und das verschlüsselte Passwort werden mit den folgenden Kommandos in die Datei ’’ ’/etc/nginx/.htpasswd’’’ geschrieben, das nginx in der Konfiguration für die User-Authentifizierung benutzt.&lt;br /&gt;
&lt;br /&gt;
Username &#039;&#039;&#039;maxmustermann&#039;&#039;&#039; anlegen (Doppelpunkt nach Username nicht übersehen!):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo sh -c &amp;quot;echo -n &#039;maxmustermann:&#039; &amp;gt;&amp;gt; /etc/nginx/.htpasswd&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Passwort-Prompt aufrufen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo sh -c &amp;quot;openssl passwd -apr1 &amp;gt;&amp;gt; /etc/nginx/.htpasswd&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zertifikatserstellung == &lt;br /&gt;
Erst durch die Zertifikate ist eine verschlüsselte Kommunikation zwischen Browser und nginx möglich&lt;br /&gt;
Beide beschriebenen Optionen sind dabei gleichermaßen sicher. Damit allerdings nicht jedes ausgestelle Zertifikat vertraut wird, gibt es das Konzept der Certificate Authorities (&#039;CA&#039;, näheres siehe Links). Jeder gängige Browser warnt den Benutzer vor einem Zertifikat, das von keiner Thrusted Authority ausgestellt wurde, bietet jedoch dem Benutzer die Möglichkeit, trotzdem fortzufahren. Durch die Tatsache, dass das Zertifikat selbst erstellt und signiert wird, kann diese Warnung im Browser später getrost umgangen werden. &lt;br /&gt;
&lt;br /&gt;
Selbst signiertes Zertifikat erstellen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dabei werden für die Erstellung ein paar Angaben abgefragt. Wichtig ist dabei der Common Name, der identisch mit der später verwendeten Domain oder öffentliche IP-Adresse sein muss.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Country Name (2 letter code) [AU]:AT&lt;br /&gt;
State or Province Name (full name) [Some-State]:Vienna&lt;br /&gt;
Locality Name (eg, city) []:Vienna&lt;br /&gt;
Organization Name (eg, company) []:privat&lt;br /&gt;
Organizational Unit Name (eg, section) []:privat&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:meine_domain_oder_ip&lt;br /&gt;
Email Address []:admin@meinedomain&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nginx neustarten, um die Änderungen und das Zertifikat zu übernehmen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ sudo service nginx reload &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der folgende Aufruf sollten bereits eingerichteten FHEM-Server via Passwort-Abfrage und HTTPS absichern:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;fhemserver&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen &amp;amp; weiterführende Links ==&lt;br /&gt;
* [https://www.digitalocean.com/community/tutorials/how-to-create-an-ssl-certificate-on-nginx-for-ubuntu-14-04 How To Create an SSL Certificate on Nginx for Ubuntu 14.04]&lt;br /&gt;
* [https://linuxconfig.org/setting-up-nginx-reverse-proxy-server-on-debian-linux Setting up Nginx Reverse Proxy server on Debian Linux]&lt;br /&gt;
* [https://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-nginx-on-ubuntu-14-04 How To Set Up Password Authentication with Nginx on Ubuntu 14.04]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol_Secure Wikipedia: HTTPS]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Transport_Layer_Security Wikipedia: TLS]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Andremotz</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver&amp;diff=16781</id>
		<title>HTTPS-Absicherung &amp; Authentifizierung via nginx Webserver</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver&amp;diff=16781"/>
		<updated>2016-10-25T21:44:36Z</updated>

		<summary type="html">&lt;p&gt;Andremotz: Proxy-Buffering off Hinweis&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ähnlich wie im Artikel [[Apache Authentication Proxy]] kann FHEM auch mit dem schlankeren nginx Webserver abgesichert werden. Nach diesem Artikel ist die Kommunikation zum FHEM-Server via HTTPS verschlüsselt und eine Authentifizierung nur via Benutzername und Passwort möglich. Externer Zugriff aus dem eigenen Netzwerk/Internet soll damit unterbunden werden; die Kommunikation und Authentifizierung findet verschlüsselt statt.&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Vorausgesetzt wird eine funktionierende FHEM Installation. Die dadurch erbrachten Linux Kenntnisse reichen für die Umsetzung dieses Artikels. Weiterführende Links zu Zertifikaten und dem nginx-Webserver befinden sich im Anhang des Artikels.&lt;br /&gt;
&lt;br /&gt;
Ausgegangen wird von einer FHEM-Installation, die auf Port 8083 via HTTP hört. Dieser Port wird abgesichert, indem er nur noch lokal und nicht mehr über das Netzwerk erreichbar ist. Anfragen auf Port 80 (HTTP, nginx) werden weitergeleitet zum lokalen Port 443 (HTTPS, nginx), der wiederum einen Reverse Proxy auf den Port 8083 (HTTPS, fhem) einrichtet. Mit leichten Modifizierungen könnte nginx auch auf einem separaten Server betrieben werden. Die benötigten Zertifikate für die HTTPS Verschlüsselung können eigenhändig angelegt werden. Der/die autorisierten Benutzer werden in einer verschlüsselten Datei hinterlegt, die nginx für die Authentifizierung benutzt.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das Setup auf einem Raspberry Pi (Raspbian - basierend auf Debian Jessie 8) und fhem 5.7. Die beschriebenen Befehle sollten sich ohne weiteres auf Ubuntu oder andere Debian-Derivate übertragen lassen. Das beschriebene Konzept lässt sich aber auf jedes Unix-Derivat anwenden.&lt;br /&gt;
&lt;br /&gt;
==Anpassungen: fhem-Config==&lt;br /&gt;
In der FHEM-Konfiguration muss sichergestellt werden, dass kein Client außerhalb des Servers zugreifen kann. Dazu muss das normalerweise gesetzte Flag global von jeglicher Konfigriation entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Beispielkonfiguration:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
# define telnetPort telnet 7072 global&lt;br /&gt;
&lt;br /&gt;
define WEB FHEMWEB 8083&lt;br /&gt;
attr WEB stylesheetPrefix dark&lt;br /&gt;
# attr WEB HTTPS&lt;br /&gt;
&lt;br /&gt;
# define WEBhomebridge FHEMWEB 8084&lt;br /&gt;
# attr WEBphone stylesheetPrefix smallscreen&lt;br /&gt;
&lt;br /&gt;
# define WEBtablet FHEMWEB 8085 global&lt;br /&gt;
# attr WEBtablet stylesheetPrefix touchpad&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
fhem neustarten:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; $ sudo service fhem stop &amp;amp;&amp;amp; sudo service fhem start &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation: nginx als reverse Proxy ==&lt;br /&gt;
nginx installieren:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo apt-get install nginx &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach im Pfad &#039;&#039;&#039;/etc/nginx/sites-available&#039;&#039;&#039; eine neue Proxy Konfiguration anlegen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo touch /etc/nginx/sites-available/reverse-proxy&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Inhalt der Datei &#039;&#039;&#039;reverse-proxy&#039;&#039;&#039;:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
&lt;br /&gt;
    listen 443;&lt;br /&gt;
    server_name fhempi;&lt;br /&gt;
&lt;br /&gt;
    ssl_certificate           /etc/nginx/cert.crt;&lt;br /&gt;
    ssl_certificate_key       /etc/nginx/cert.key;&lt;br /&gt;
&lt;br /&gt;
    ssl on;&lt;br /&gt;
    ssl_session_cache  builtin:1000  shared:SSL:10m;&lt;br /&gt;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;&lt;br /&gt;
    ssl_prefer_server_ciphers on;&lt;br /&gt;
&lt;br /&gt;
    access_log            /var/log/nginx/jenkins.access.log;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
&lt;br /&gt;
      proxy_set_header        Host $host;&lt;br /&gt;
      proxy_set_header        X-Real-IP $remote_addr;&lt;br /&gt;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
      proxy_set_header        X-Forwarded-Proto $scheme;&lt;br /&gt;
&lt;br /&gt;
      proxy_pass          http://localhost:8083;&lt;br /&gt;
      proxy_read_timeout  90;&lt;br /&gt;
&lt;br /&gt;
        auth_basic &amp;quot;Restricted Content&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
      # proxy_redirect      http://localhost:8083 https://localhost;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Mit dieser Konfiguration werden zwei Server-Instanzen auf Port 80 und Port 443 angelegt. Surft ein Browser/eine App Port 80 an, wird er umgehend zum verschlüsselten Port 443 weitergeleitet. Die Zertifikate befinden sich im lokalen Verzeichnis unter /etc/nginx und verschlüsselt wird via TLS.&lt;br /&gt;
&lt;br /&gt;
Hinweis: Ein User hatte für mich nicht navollziehbare Probleme und empfiehlt folgende Settings:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
   proxy_read_timeout  2073600;&lt;br /&gt;
      proxy_buffering off;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== User anlegen für Authentifizierung ==&lt;br /&gt;
Der Username und das verschlüsselte Passwort werden mit den folgenden Kommandos in die Datei ’’ ’/etc/nginx/.htpasswd’’’ geschrieben, das nginx in der Konfiguration für die User-Authentifizierung benutzt.&lt;br /&gt;
&lt;br /&gt;
Username &#039;&#039;&#039;maxmustermann&#039;&#039;&#039; anlegen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo sh -c &amp;quot;echo -n &#039;maxmustermann:&#039; &amp;gt;&amp;gt; /etc/nginx/.htpasswd&amp;quot; &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Passwort-Prompt aufrufen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo sh -c &amp;quot;openssl passwd -apr1 &amp;gt;&amp;gt; /etc/nginx/.htpasswd&amp;quot; &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zertifikatserstellung == &lt;br /&gt;
Erst durch die Zertifikate ist eine verschlüsselte Kommunikation zwischen Browser und nginx möglich&lt;br /&gt;
Beide beschriebenen Optionen sind dabei gleichermaßen sicher. Damit allerdings nicht jedes ausgestelle Zertifikat vertraut wird, gibt es das Konzept der Certificate Authorities (&#039;CA&#039;, näheres siehe Links). Jeder gängige Browser warnt den Benutzer vor einem Zertifikat, das von keiner Thrusted Authority ausgestellt wurde, bietet jedoch dem Benutzer die Möglichkeit, trotzdem fortzufahren. Durch die Tatsache, dass das Zertifikat selbst erstellt und signiert wird, kann diese Warnung im Browser später getrost umgangen werden. &lt;br /&gt;
&lt;br /&gt;
Selbst signiertes Zertifikat erstellen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dabei werden für die Erstellung ein paar Angaben abgefragt. Wichtig ist dabei der Common Name, der identisch mit der später verwendeten Domain oder öffentliche IP-Adresse sein muss.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Country Name (2 letter code) [AU]:AT&lt;br /&gt;
State or Province Name (full name) [Some-State]:Vienna&lt;br /&gt;
Locality Name (eg, city) []:Vienna&lt;br /&gt;
Organization Name (eg, company) []:privat&lt;br /&gt;
Organizational Unit Name (eg, section) []:privat&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:meine_domain_oder_ip&lt;br /&gt;
Email Address []:admin@meinedomain&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nginx neustarten, um die Änderungen und das Zertifikat zu übernehmen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo service nginx reload &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der folgende Aufruf sollten bereits eingerichteten FHEM-Server via Passwort-Abfrage und HTTPS absichern:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;fhemserver&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen &amp;amp; weiterführende Links ==&lt;br /&gt;
* [https://www.digitalocean.com/community/tutorials/how-to-create-an-ssl-certificate-on-nginx-for-ubuntu-14-04 How To Create an SSL Certificate on Nginx for Ubuntu 14.04]&lt;br /&gt;
* [https://linuxconfig.org/setting-up-nginx-reverse-proxy-server-on-debian-linux Setting up Nginx Reverse Proxy server on Debian Linux]&lt;br /&gt;
* [https://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-nginx-on-ubuntu-14-04 How To Set Up Password Authentication with Nginx on Ubuntu 14.04]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol_Secure Wikipedia: HTTPS]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Transport_Layer_Security Wikipedia: TLS]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HOWTOS]]&lt;/div&gt;</summary>
		<author><name>Andremotz</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver&amp;diff=15823</id>
		<title>HTTPS-Absicherung &amp; Authentifizierung via nginx Webserver</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver&amp;diff=15823"/>
		<updated>2016-07-14T11:17:17Z</updated>

		<summary type="html">&lt;p&gt;Andremotz: minor changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ähnlich wie im Artikel [[Apache Authentication Proxy]] kann Fhem auch mit dem schlankeren nginx Webserver abgesichert werden. Nach diesem Artikel ist die Kommunikation zum Fhem-Server via HTTPS verschlüsselt und eine Authentifizierung nur via Benutzername und Passwort möglich. Externer Zugriff aus dem eigenen Netzwerk/Internet soll damit unterbunden werden; die Kommunikation und Authentifizierung findet verschlüsselt statt.&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Vorausgesetzt wird eine funktionierende Fhem Installation. Die dadurch erbrachten Linux Kenntnisse reichen für die Umsetzung dieses Artikels. Weiterführende Links zu Zertifikaten und dem nginx-Webserver befinden sich im Anhang des Artikels.&lt;br /&gt;
&lt;br /&gt;
Ausgegangen wird von einer Fhem-Installation, die auf Port 8083 via HTTP hört. Dieser Port wird abgesichert, indem er nur noch lokal und nicht mehr über das Netzwerk erreichbar ist. Anfragen auf Port 80 (HTTP, nginx) werden weitergeleitet zum lokalen Port 443 (HTTPS, nginx), der wiederum einen Reverse Proxy auf den Port 8083 (HTTPS, fhem) einrichtet. Mit leichten Modifizierungen könnte nginx auch auf einem separaten Server betrieben werden. Die benötigten Zertifikate für die HTTPS Verschlüsselung können eigenhändig angelegt werden. Der/die autorisierten Benutzer werden in einer verschlüsselten Datei hinterlegt, die nginx für die Authentifizierung benutzt.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das Setup auf einem Raspberry Pi (Raspbian - basierend auf Debian Jessie 8) und fhem 5.7. Die beschriebenen Befehle sollten sich ohne weiteres auf Ubuntu oder andere Debian-Derivate übertragen lassen. Das beschriebene Konzept lässt sich aber auf jedes Unix-Derivat anwenden.&lt;br /&gt;
&lt;br /&gt;
==Anpassungen: fhem-Config==&lt;br /&gt;
In der Fhem-Konfiguration muss sichergestellt werden, dass kein Client außerhalb des Servers zugreifen kann. Dazu muss das normalerweise gesetzte Flag global von jeglicher Konfigriation entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Beispielkonfiguration:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
# define telnetPort telnet 7072 global&lt;br /&gt;
&lt;br /&gt;
define WEB FHEMWEB 8083&lt;br /&gt;
attr WEB stylesheetPrefix dark&lt;br /&gt;
# attr WEB HTTPS&lt;br /&gt;
&lt;br /&gt;
# define WEBhomebridge FHEMWEB 8084&lt;br /&gt;
# attr WEBphone stylesheetPrefix smallscreen&lt;br /&gt;
&lt;br /&gt;
# define WEBtablet FHEMWEB 8085 global&lt;br /&gt;
# attr WEBtablet stylesheetPrefix touchpad&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
fhem neustarten:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; $ sudo service fhem stop &amp;amp;&amp;amp; sudo service fhem start &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation: nginx als reverse Proxy ==&lt;br /&gt;
nginx installieren:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo apt-get install nginx &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach im Pfad &#039;&#039;&#039;/etc/nginx/sites-available&#039;&#039;&#039; eine neue Proxy Konfiguration anlegen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo touch /etc/nginx/sites-available/reverse-proxy&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Inhalt der Datei &#039;&#039;&#039;reverse-proxy&#039;&#039;&#039;:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
&lt;br /&gt;
    listen 443;&lt;br /&gt;
    server_name fhempi;&lt;br /&gt;
&lt;br /&gt;
    ssl_certificate           /etc/nginx/cert.crt;&lt;br /&gt;
    ssl_certificate_key       /etc/nginx/cert.key;&lt;br /&gt;
&lt;br /&gt;
    ssl on;&lt;br /&gt;
    ssl_session_cache  builtin:1000  shared:SSL:10m;&lt;br /&gt;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;&lt;br /&gt;
    ssl_prefer_server_ciphers on;&lt;br /&gt;
&lt;br /&gt;
    access_log            /var/log/nginx/jenkins.access.log;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
&lt;br /&gt;
      proxy_set_header        Host $host;&lt;br /&gt;
      proxy_set_header        X-Real-IP $remote_addr;&lt;br /&gt;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
      proxy_set_header        X-Forwarded-Proto $scheme;&lt;br /&gt;
&lt;br /&gt;
      proxy_pass          http://localhost:8083;&lt;br /&gt;
      proxy_read_timeout  90;&lt;br /&gt;
&lt;br /&gt;
        auth_basic &amp;quot;Restricted Content&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
      # proxy_redirect      http://localhost:8083 https://localhost;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Mit dieser Konfiguration werden zwei Server-Instanzen auf Port 80 und Port 443 angelegt. Surft ein Browser/eine App Port 80 an, wird er umgehend zum verschlüsselten Port 443 weitergeleitet. Die Zertifikate befinden sich im lokalen Verzeichnis unter /etc/nginx und verschlüsselt wird via TLS.&lt;br /&gt;
== User anlegen für Authentifizierung ==&lt;br /&gt;
Der Username und das verschlüsselte Passwort werden mit den folgenden Kommandos in die Datei ’’ ’/etc/nginx/.htpasswd’’’ geschrieben, das nginx in der Konfiguration für die User-Authentifizierung benutzt.&lt;br /&gt;
&lt;br /&gt;
Username &#039;&#039;&#039;maxmustermann&#039;&#039;&#039; anlegen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo sh -c &amp;quot;echo -n &#039;maxmustermann:&#039; &amp;gt;&amp;gt; /etc/nginx/.htpasswd&amp;quot; &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Passwort-Prompt aufrufen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo sh -c &amp;quot;openssl passwd -apr1 &amp;gt;&amp;gt; /etc/nginx/.htpasswd&amp;quot; &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zertifikatserstellung == &lt;br /&gt;
Erst durch die Zertifikate ist eine verschlüsselte Kommunikation zwischen Browser und nginx möglich&lt;br /&gt;
Beide beschriebenen Optionen sind dabei gleichermaßen sicher. Damit allerdings nicht jedes ausgestelle Zertifikat vertraut wird, gibt es das Konzept der Certificate Authorities (&#039;CA&#039;, näheres siehe Links). Jeder gängige Browser warnt den Benutzer vor einem Zertifikat, das von keiner Thrusted Authority ausgestellt wurde, bietet jedoch dem Benutzer die Möglichkeit, trotzdem fortzufahren. Durch die Tatsache, dass das Zertifikat selbst erstellt und signiert wird, kann diese Warnung im Browser später getrost umgangen werden. &lt;br /&gt;
&lt;br /&gt;
Selbst signiertes Zertifikat erstellen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dabei werden für die Erstellung ein paar Angaben abgefragt. Wichtig ist dabei der Common Name, der identisch mit der später verwendeten Domain oder öffentliche IP-Adresse sein muss.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Country Name (2 letter code) [AU]:AT&lt;br /&gt;
State or Province Name (full name) [Some-State]:Vienna&lt;br /&gt;
Locality Name (eg, city) []:Vienna&lt;br /&gt;
Organization Name (eg, company) []:privat&lt;br /&gt;
Organizational Unit Name (eg, section) []:privat&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:meine_domain_oder_ip&lt;br /&gt;
Email Address []:admin@meinedomain&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nginx neustarten, um die Änderungen und das Zertifikat zu übernehmen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo service nginx reload &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der folgende Aufruf sollten bereits eingerichteten fhem-Server via Passwort-Abfrage und HTTPS absichern:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;fhemserver&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen &amp;amp; weiterführende Links ==&lt;br /&gt;
* [https://www.digitalocean.com/community/tutorials/how-to-create-an-ssl-certificate-on-nginx-for-ubuntu-14-04 How To Create an SSL Certificate on Nginx for Ubuntu 14.04]&lt;br /&gt;
* [https://linuxconfig.org/setting-up-nginx-reverse-proxy-server-on-debian-linux Setting up Nginx Reverse Proxy server on Debian Linux]&lt;br /&gt;
* [https://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-nginx-on-ubuntu-14-04 How To Set Up Password Authentication with Nginx on Ubuntu 14.04]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol_Secure Wikipedia: HTTPS]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Transport_Layer_Security Wikipedia: TLS]&lt;/div&gt;</summary>
		<author><name>Andremotz</name></author>
	</entry>
	<entry>
		<id>http://wiki.fhem.de/w/index.php?title=HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver&amp;diff=15822</id>
		<title>HTTPS-Absicherung &amp; Authentifizierung via nginx Webserver</title>
		<link rel="alternate" type="text/html" href="http://wiki.fhem.de/w/index.php?title=HTTPS-Absicherung_%26_Authentifizierung_via_nginx_Webserver&amp;diff=15822"/>
		<updated>2016-07-14T11:06:58Z</updated>

		<summary type="html">&lt;p&gt;Andremotz: Seite Neuerstellung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ähnlich wie im Artikel [[Apache Authentication Proxy]] kann Fhem auch mit dem schlankeren nginx Webserver abgesichert werden. Nach diesem Artikel ist die Kommunikation zum Fhem-Server via HTTPS verschlüsselt und eine Authentifizierung nur via Benutzername und Passwort möglich. Externer Zugriff aus dem eigenen Netzwerk/Internet soll damit unterbunden werden; die Kommunikation und Authentifizierung findet verschlüsselt statt.&lt;br /&gt;
== Voraussetzungen ==&lt;br /&gt;
Vorausgesetzt wird eine funktionierende Fhem Installation. Die dadurch erbrachten Linux Kenntnisse reichen für die Umsetzung dieses Artikels. Weiterführende Links zu Zertifikaten und dem nginx-Webserver befinden sich im Anhang des Artikels.&lt;br /&gt;
&lt;br /&gt;
Ausgegangen wird von einer Fhem-Installation, die auf Port 8083 via HTTP hört. Dieser Port wird abgesichert, indem er nur noch lokal und nicht mehr über das Netzwerk erreichbar ist. Anfragen auf Port 80 (HTTP, nginx) werden weitergeleitet zum lokalen Port 443 (HTTPS, nginx), der wiederum einen Reverse Proxy auf den Port 8083 (HTTPS, fhem) einrichtet. Mit leichten Modifizierungen könnte nginx auch auf einem separaten Server betrieben werden. Die benötigten Zertifikate für die HTTPS Verschlüsselung können eigenhändig angelegt werden. Der/die autorisierten Benutzer werden in einer verschlüsselten Datei hinterlegt, die nginx für die Authentifizierung benutzt.&lt;br /&gt;
&lt;br /&gt;
Getestet wurde das Setup auf einem Raspberry Pi (Raspbian - basierend auf Debian Jessie 8) und fhem 5.7. Die beschriebenen Befehle sollten sich ohne weiteres auf Ubuntu oder andere Debian-Derivate übertragen lassen. Das beschriebene Konzept lässt sich aber auf jedes Unix-Derivat anwenden.&lt;br /&gt;
&lt;br /&gt;
==Anpassungen: fhem-Config==&lt;br /&gt;
In der Fhem-Konfiguration muss sichergestellt werden, dass kein Client außerhalb des Servers zugreifen kann. Dazu muss das normalerweise gesetzte Flag global von jeglicher Konfigriation entfernt werden.&lt;br /&gt;
&lt;br /&gt;
Beispielkonfiguration:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
attr global userattr cmdIcon devStateIcon devStateStyle genericDeviceType:ignore,switch,outlet,light$&lt;br /&gt;
attr global autoload_undefined_devices 1&lt;br /&gt;
attr global logfile ./log/fhem-%Y-%m.log&lt;br /&gt;
attr global modpath .&lt;br /&gt;
attr global motd SecurityCheck:\&lt;br /&gt;
\&lt;br /&gt;
WEB,WEBphone,WEBtablet has no basicAuth attribute.\&lt;br /&gt;
telnetPort has no password/globalpassword attribute.\&lt;br /&gt;
\&lt;br /&gt;
Restart FHEM for a new check if the problem is fixed,\&lt;br /&gt;
or set the global attribute motd to none to supress this message.\&lt;br /&gt;
&lt;br /&gt;
attr global statefile ./log/fhem.save&lt;br /&gt;
attr global updateInBackground 1&lt;br /&gt;
attr global verbose 3&lt;br /&gt;
&lt;br /&gt;
# define telnetPort telnet 7072 global&lt;br /&gt;
&lt;br /&gt;
define WEB FHEMWEB 8083&lt;br /&gt;
attr WEB stylesheetPrefix dark&lt;br /&gt;
# attr WEB HTTPS&lt;br /&gt;
&lt;br /&gt;
# define WEBhomebridge FHEMWEB 8084&lt;br /&gt;
# attr WEBphone stylesheetPrefix smallscreen&lt;br /&gt;
&lt;br /&gt;
# define WEBtablet FHEMWEB 8085 global&lt;br /&gt;
# attr WEBtablet stylesheetPrefix touchpad&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
fhem neustarten:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; $ sudo service fhem stop &amp;amp;&amp;amp; sudo service fhem start &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation: nginx als reverse Proxy ==&lt;br /&gt;
nginx installieren:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo apt-get install nginx &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Danach im Pfad &#039;&#039;&#039;/etc/nginx/sites-available&#039;&#039;&#039; eine neue Proxy Konfiguration anlegen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo touch /etc/nginx/sites-available/reverse-proxy&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Inhalt der Datei &#039;&#039;&#039;reverse-proxy&#039;&#039;&#039;:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 80;&lt;br /&gt;
    return 301 https://$host$request_uri;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
server {&lt;br /&gt;
&lt;br /&gt;
    listen 443;&lt;br /&gt;
    server_name fhempi;&lt;br /&gt;
&lt;br /&gt;
    ssl_certificate           /etc/nginx/cert.crt;&lt;br /&gt;
    ssl_certificate_key       /etc/nginx/cert.key;&lt;br /&gt;
&lt;br /&gt;
    ssl on;&lt;br /&gt;
    ssl_session_cache  builtin:1000  shared:SSL:10m;&lt;br /&gt;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;&lt;br /&gt;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;&lt;br /&gt;
    ssl_prefer_server_ciphers on;&lt;br /&gt;
&lt;br /&gt;
    access_log            /var/log/nginx/jenkins.access.log;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
&lt;br /&gt;
      proxy_set_header        Host $host;&lt;br /&gt;
      proxy_set_header        X-Real-IP $remote_addr;&lt;br /&gt;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
      proxy_set_header        X-Forwarded-Proto $scheme;&lt;br /&gt;
&lt;br /&gt;
      proxy_pass          http://localhost:8083;&lt;br /&gt;
      proxy_read_timeout  90;&lt;br /&gt;
&lt;br /&gt;
        auth_basic &amp;quot;Restricted Content&amp;quot;;&lt;br /&gt;
        auth_basic_user_file /etc/nginx/.htpasswd;&lt;br /&gt;
&lt;br /&gt;
      # proxy_redirect      http://localhost:8083 https://localhost;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Mit dieser Konfiguration werden zwei Server-Instanzen auf Port 80 und Port 443 angelegt. Surft ein Browser/eine App Port 80 an, wird er umgehend zum verschlüsselten Port 443 weitergeleitet. Die Zertifikate befinden sich im lokalen Verzeichnis unter /etc/nginx und verschlüsselt wird via TLS.&lt;br /&gt;
== User anlegen für Authentifizierung ==&lt;br /&gt;
Der Username und das verschlüsselte Passwort werden mit den folgenden Kommandos in die Datei ’’ ’/etc/nginx/.htpasswd’’’ geschrieben, das nginx in der Konfiguration für die User-Authentifizierung benutzt.&lt;br /&gt;
&lt;br /&gt;
Username &#039;&#039;&#039;maxmustermann&#039;&#039;&#039; anlegen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo sh -c &amp;quot;echo -n &#039;maxmustermann:&#039; &amp;gt;&amp;gt; /etc/nginx/.htpasswd&amp;quot; &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Passwort-Prompt aufrufen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo sh -c &amp;quot;openssl passwd -apr1 &amp;gt;&amp;gt; /etc/nginx/.htpasswd&amp;quot; &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zertifikatserstellung == &lt;br /&gt;
Erst durch die Zertifikate ist eine verschlüsselte Kommunikation zwischen Browser und nginx möglich&lt;br /&gt;
Beide beschriebenen Optionen sind dabei gleichermaßen sicher. Damit allerdings nicht jedes ausgestelle Zertifikat vertraut wird, gibt es das Konzept der Certificate Authorities (&#039;CA&#039;, näheres siehe Links). Jeder gängige Browser warnt den Benutzer vor einem Zertifikat, das von keiner Thrusted Authority ausgestellt wurde, bietet jedoch dem Benutzer die Möglichkeit, trotzdem fortzufahren. Durch die Tatsache, dass das Zertifikat selbst erstellt und signiert wird, kann diese Warnung im Browser später getrost umgangen werden. &lt;br /&gt;
&lt;br /&gt;
Selbst signiertes Zertifikat erstellen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Dabei werden für die Erstellung ein paar Angaben abgefragt. Wichtig ist dabei der Common Name, der identisch mit der später verwendeten Domain oder öffentliche IP-Adresse sein muss.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
Country Name (2 letter code) [AU]:AT&lt;br /&gt;
State or Province Name (full name) [Some-State]:Vienna&lt;br /&gt;
Locality Name (eg, city) []:Vienna&lt;br /&gt;
Organization Name (eg, company) []:privat&lt;br /&gt;
Organizational Unit Name (eg, section) []:privat&lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:meine_domain_oder_ip&lt;br /&gt;
Email Address []:admin@meinedomain&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nginx neustarten, um die Änderungen und das Zertifikat zu übernehmen:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ sudo service nginx reload &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der folgende Aufruf sollten bereits eingerichteten fhem-Server via Passwort-Abfrage und HTTPS absichern:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;fhemserver&amp;gt;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen &amp;amp; weiterführende Links ==&lt;br /&gt;
* [https://www.digitalocean.com/community/tutorials/how-to-create-an-ssl-certificate-on-nginx-for-ubuntu-14-04 How To Create an SSL Certificate on Nginx for Ubuntu 14.04]&lt;br /&gt;
* [https://linuxconfig.org/setting-up-nginx-reverse-proxy-server-on-debian-linux Setting up Nginx Reverse Proxy server on Debian Linux]&lt;br /&gt;
* [https://www.digitalocean.com/community/tutorials/how-to-set-up-password-authentication-with-nginx-on-ubuntu-14-04 How To Set Up Password Authentication with Nginx on Ubuntu 14.04]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol_Secure Wikipedia: HTTPS]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Transport_Layer_Security Wikipadia: TLS]&lt;/div&gt;</summary>
		<author><name>Andremotz</name></author>
	</entry>
</feed>