Good to Know Database

Raspbian Jessie: HTTPS mit Apache2 und OpenSSL


Wie bereits in der Anleitung Raspbian Jessie: Webserver mit Apache2, PHP und MySQL installieren beschrieben ist ein Webserver mit Apache2 sehr schnell konfiguriert. Standardmäßig lässt dieser aber nur unverschlüsselte Zugriffe über das HTTP-Protokoll (Hypertext Transfer Protocol) zu. Sollten Sie auf Sicherheit achten, können Sie Apache2 um die Unterstützung von SSL (Secure Sockets Layer) erweitern und so das HTTPS-Protokoll (Hypertext Transfer Protocol Secure) für den verschlüsselten Zugriff auf den Webserver nutzen.

Die folgende Anleitung soll Ihnen zeigen, wie Sie auf Ihrem Raspberry Pi unter Raspbian den Webserver Apache2 installieren, mit OpenSSL die benötigten Zertifikate für einen verschlüsselten Zugriff auf den Webserver erstellen und diese in Apache2 einbinden. Als Grundlage für die folgende Anleitung wurde das momentan aktuelle Raspbian Jessie Lite Image vom 23.09.2016 verwendet.

Apache2 installieren

Sollten Sie Apache2 noch nicht installiert haben, können Sie Apache2 wie folgt installieren. Bevor Sie jedoch mit der Installation loslegen, sollten Sie die lokale Paketdatenbank aktualisieren.

pi@raspberrypi ~ $ sudo apt-get update

Mit dem nachfolgenden Befehl können Sie jetzt den Webserver Apache2 installieren.

pi@raspberrypi ~ $ sudo apt-get install apache2

Im Anschluss an die Installation wird in der Regel der Apache2-Daemon automatisch gestartet. Dies können Sie mit dem folgenden Befehl überprüfen.

pi@raspberrypi ~ $ sudo /etc/init.d/apache2 status

Eigene Certificate Authority (CA) einrichten

Zuerst erstellen Sie ein Verzeichnis in welchem die nachfolgenden Zertifikate erstellt und aufbewahrt werden.

pi@raspberrypi ~ $ sudo mkdir -p /etc/ssl/apache2/certs

Erstellen Sie jetzt mit dem folgenden Befehl einen Certificate Authority (CA) Schlüssel. Während diesem Vorgang müssen Sie ein Passwort vergeben welches Sie im weiteren Verlauf noch öfters benötigen werden.

pi@raspberrypi ~ $ sudo openssl genrsa -des3 -out /etc/ssl/apache2/certs/ca.key 2048
Generating RSA private key, 2048 bit long modulus
..............+++
................+++
e is 65537 (0x10001)
Enter pass phrase for /etc/ssl/apache2/certs/ca.key:StrengGeheim
Verifying - Enter pass phrase for /etc/ssl/apache2/certs/ca.key:StrengGeheim

Nachdem der CA-Schlüssel erstellt wurde, wird die Certificate Authority erzeugt. Mit dem Parameter -days wird angegeben wie lange der Schlüssel gültig sein soll (hier 10 Jahre).

pi@raspberrypi ~ $ sudo openssl req -new -x509 -days 3650 -key /etc/ssl/apache2/certs/ca.key -out /etc/ssl/apache2/certs/ca.crt
Enter pass phrase for /etc/ssl/apache2/certs/ca.key:StrengGeheim
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Bayern
Locality Name (eg, city) []:Brennberg
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Privat
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:ca.home.lan
Email Address []:root@localhost

Mit dem folgenden Befehl können Sie sich die Details des Zertifikats ansehen.

pi@raspberrypi ~ $ openssl x509 -in /etc/ssl/apache2/certs/ca.crt -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            9f:23:ad:51:86:e1:9c:4d
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=DE, ST=Bayern, L=Brennberg, O=Privat, OU=IT, CN=ca.home.lan/emailAddress=root@localhost
        Validity
            Not Before: Nov 22 19:28:20 2016 GMT
            Not After : Nov 20 19:28:20 2026 GMT
        Subject: C=DE, ST=Bayern, L=Brennberg, O=Privat, OU=IT, CN=ca.home.lan/emailAddress=root@localhost
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:bf:1f:2c:6e:23:d2:51:a9:2f:35:20:96:98:04:
                    4a:7a:c2:b7:f3:e1:06:8a:cf:ef:ae:09:46:f2:e2:
                    f2:c3:f7:86:64:65:58:52:6e:f5:e9:20:b6:2f:ee:
                    2c:6a:2b:20:40:4a:38:00:f8:fa:4e:5a:26:89:26:
                    c5:d8:d6:4c:5f:32:e6:8d:f7:2f:f6:16:10:16:b5:
                    36:03:9c:68:10:39:fd:76:33:04:ed:d3:58:0f:b9:
                    4f:d7:cc:1e:a3:68:bf:f0:dc:cb:21:fc:65:54:08:
                    a1:ae:85:f5:e0:10:e7:59:71:d7:82:8e:2f:1a:83:
                    35:b3:c2:b9:12:0e:e7:46:b9:d1:b9:29:03:bb:72:
                    03:40:65:15:f6:18:7d:c2:ea:93:8b:a8:f7:fa:44:
                    82:37:4b:7c:36:99:51:e6:50:55:e1:e1:5c:1e:ab:
                    63:b7:cd:15:7b:ad:e1:75:61:39:b1:ae:24:f6:28:
                    50:ec:f6:f0:ca:68:8b:48:55:7c:27:7a:47:10:5c:
                    0c:a7:a9:d6:fd:d2:17:ca:e8:e3:9c:23:8c:b8:46:
                    b5:dd:0c:d9:d6:29:98:45:1b:ba:11:64:2c:70:97:
                    de:da:4c:71:36:ea:e4:bf:fd:8a:0b:f2:94:ec:37:
                    ee:34:68:95:74:c2:07:e4:25:90:09:7c:14:5e:ee:
                    20:bb
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                E5:D7:F7:15:F0:1B:2D:68:8A:04:66:FB:6B:B9:67:9A:48:C9:A4:C0
            X509v3 Authority Key Identifier:
                keyid:E5:D7:F7:15:F0:1B:2D:68:8A:04:66:FB:6B:B9:67:9A:48:C9:A4:C0

            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         bd:a3:a1:6c:bd:f4:5d:af:b4:36:20:1f:d0:57:e3:6f:9d:64:
         d2:fa:29:09:6b:d2:86:d9:b7:80:c7:7a:7d:47:ff:ad:7b:27:
         69:a8:9f:a2:17:7c:63:2c:8c:95:11:6e:27:59:ab:7b:47:44:
         15:f1:68:20:6c:20:1e:4c:73:6d:87:5d:fe:d3:1b:af:02:98:
         8f:64:f6:2d:7d:61:d6:ba:a1:a3:11:c5:15:7c:8e:b6:14:e1:
         0e:61:22:aa:b8:4b:8f:16:1b:f8:2f:6e:56:0f:45:06:7a:c1:
         0e:54:34:a4:08:f5:b4:5a:c5:21:0f:36:89:44:68:3d:c3:b1:
         6d:51:58:a8:a3:91:13:43:d9:cb:dd:e6:e5:2f:2f:65:dc:a4:
         71:d1:b7:a1:f1:3e:a2:bf:1d:38:c5:a1:ec:95:05:24:fa:b0:
         0a:a0:1c:2c:f1:7d:e5:7b:2e:18:cd:41:22:dd:44:f5:00:ce:
         01:ce:76:49:f4:86:dd:fe:e1:eb:d8:a4:fb:ee:01:bc:af:61:
         21:30:42:b4:ac:4c:0f:c1:46:00:93:42:23:38:93:c8:57:3e:
         82:d7:f9:99:c2:fa:18:cc:6f:65:aa:6c:59:54:24:ac:a6:d8:
         f0:ad:55:e5:35:d5:14:6d:2f:9f:3a:6c:5e:18:13:02:24:2e:
         f4:dd:43:35

Schlüssel und Zertifikat für den Webserver erstellen

Nachdem Sie Ihre eigene Certificate Authority (CA) eingerichtet haben, können Sie jetzt den Schlüssel und das Zertifikat für den Webserver erstellen. Zuerst erstellen Sie einen privaten RSA-Schlüssel für den Webserver.

pi@raspberrypi ~ $ sudo openssl genrsa -des3 -out /etc/ssl/apache2/certs/server.key 1024
Generating RSA private key, 1024 bit long modulus
..............++++++
........++++++
e is 65537 (0x10001)
Enter pass phrase for /etc/ssl/apache2/certs/server.key:StrengGeheim
Verifying - Enter pass phrase for /etc/ssl/apache2/certs/server.key:StrengGeheim

Anschließend erzeugen Sie einen Certificate Signing Request (CSR) für den Server.

Hinweis: Als Common Name müssen Sie den Domain Namen angeben über welchen der Webserver angesprochen wird.

pi@raspberrypi ~ $ sudo openssl req -new -key /etc/ssl/apache2/certs/server.key -out /etc/ssl/apache2/certs/server.csr
Enter pass phrase for /etc/ssl/apache2/certs/server.key:StrengGeheim
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Bayern
Locality Name (eg, city) []:Brennberg
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Privat
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:raspberrypi.home.lan
Email Address []:root@localhost

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Mit dem nächsten Befehl wird das Zertifikat für den Webserver erzeugt.

pi@raspberrypi ~ $ sudo openssl x509 -req -in /etc/ssl/apache2/certs/server.csr -out /etc/ssl/apache2/certs/server.crt -sha1 -CA /etc/ssl/apache2/certs/ca.crt -CAkey /etc/ssl/apache2/certs/ca.key -CAcreateserial -days 3650
Signature ok
subject=/C=DE/ST=Bayern/L=Brennberg/O=Privat/OU=IT/CN=raspberrypi.home.lan/emailAddress=root@localhost
Getting CA Private Key
Enter pass phrase for /etc/ssl/apache2/certs/ca.key:StrengGeheim

Auch hier können Sie sich die Details des Zertifikats anzeigen lassen.

pi@raspberrypi ~ $ openssl x509 -in /etc/ssl/apache2/certs/server.crt -text -noout
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            81:8c:97:f7:da:61:f8:cf
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=DE, ST=Bayern, L=Brennberg, O=Privat, OU=IT, CN=ca.home.lan/emailAddress=root@localhost
        Validity
            Not Before: Nov 22 19:31:18 2016 GMT
            Not After : Nov 20 19:31:18 2026 GMT
        Subject: C=DE, ST=Bayern, L=Brennberg, O=Privat, OU=IT, CN=raspberrypi.home.lan/emailAddress=root@localhost
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (1024 bit)
                Modulus:
                    00:d8:e1:e9:10:25:9d:aa:af:7f:f4:c7:95:3e:c0:
                    4c:3f:f1:23:fd:81:4c:30:d4:1f:04:bb:c5:76:a7:
                    64:66:81:f9:cd:21:56:db:07:d0:87:22:74:76:2d:
                    1c:c7:8a:6d:47:83:fc:8d:c2:15:e4:02:f9:82:3b:
                    29:91:2e:cd:53:a2:7d:a2:18:fb:d3:d1:7a:47:ef:
                    96:f6:5a:6f:18:d2:af:51:66:7f:78:fa:85:63:56:
                    f6:56:b6:5c:91:25:41:39:e6:97:c3:89:2f:c3:8f:
                    87:7f:84:cd:67:5d:4d:fb:64:42:99:0d:2d:8c:00:
                    0d:35:25:4c:60:59:1e:6c:db
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha1WithRSAEncryption
         9a:0d:6a:c7:4b:c8:78:ab:c7:7b:3d:54:93:36:c0:2a:69:47:
         d3:88:d2:ff:b3:7d:4a:69:39:3d:d4:d8:20:8f:10:4d:21:2a:
         ba:bd:b1:8d:78:a7:30:16:34:68:71:65:4e:01:f0:49:c4:00:
         74:01:0f:a8:26:88:d7:d6:5c:03:a1:38:e3:6c:c2:79:67:64:
         ad:e3:ab:6d:13:f9:37:c5:96:2c:fd:1c:0e:ed:81:86:58:a5:
         41:dd:b2:ab:c3:f0:0c:97:e9:44:ae:ad:d9:b8:96:89:34:18:
         d7:82:14:15:64:d4:35:1e:83:be:36:4b:70:5e:46:a5:f8:27:
         13:51:41:20:e4:ef:88:aa:77:d2:50:2b:bc:c7:42:94:dd:a8:
         79:33:97:a1:e4:a3:fe:81:27:08:83:d5:ea:99:ff:87:48:c0:
         5b:d6:ab:28:8f:d3:fe:ba:bc:cf:5c:f2:fc:7d:1d:84:08:5e:
         ec:d2:8e:fb:b3:ad:5f:38:ce:a9:0d:63:45:5a:a8:be:d7:db:
         83:a8:87:e4:ac:18:bf:6c:e7:27:d6:13:dd:6c:2f:3b:65:3b:
         4b:88:4f:d9:23:47:66:c8:29:bb:e1:36:3b:fc:0d:f2:46:c7:
         fe:22:0e:dd:15:1c:4b:aa:87:16:8e:70:4c:02:8a:9b:f9:33:
         92:e2:be:25

Wenn Sie den soeben erstellen Server-Schlüssel einsetzen, werden Sie bei jedem (Neu-)Start des Webservers zur Eingabe des zugehörigen Passwortes aufgefordert. Dies ist eine Sicherheitsfunktion welche Sie aber wie folgt umgehen können. Dadurch ist es dann wieder möglich, dass der Webserver wieder automatisch gestartet wird.

Erstellen Sie zuerst eine Kopie des Server-Schlüssels.

pi@raspberrypi ~ $ sudo cp /etc/ssl/apache2/certs/server.key /etc/ssl/apache2/certs/server.key.org

Anschließend rufen Sie den folgenden Befehl auf und geben das Passwort für Ihren Server-Schlüssel ein.

pi@raspberrypi ~ $ sudo openssl rsa -in /etc/ssl/apache2/certs/server.key.org -out /etc/ssl/apache2/certs/server.key
Enter pass phrase for /etc/ssl/apache2/certs/server.key.org:StrengGeheim
writing RSA key

Aus Sicherheitsgründen sollten Sie jetzt die Rechte der erzeugten Dateien ändern, damit andere Benutzer diese nicht lesen beziehungsweise kopieren können.

pi@raspberrypi ~ $ sudo chmod 0600 /etc/ssl/apache2/certs/*

Apache2 konfigurieren

Da Sie jetzt alle benötigten Schlüssel und Zertifikate erstellt haben, kommen wir nun zur Apache2-Konfiguration. Zuerst erstellen Sie ein Verzeichnis in welches anschließend die von Apache2 benötigten Schlüssel und Zertifikate kopiert werden.

pi@raspberrypi ~ $ sudo mkdir -p /etc/apache2/ssl
pi@raspberrypi ~ $ sudo cp /etc/ssl/apache2/certs/ca.crt /etc/ssl/apache2/certs/server.crt /etc/ssl/apache2/certs/server.key /etc/apache2/ssl/

Öffnen Sie anschließend die Konfigurationsdatei /etc/apache2/sites-available/default-ssl.conf mit einem Editor.

pi@raspberrypi ~ $ sudo vi /etc/apache2/sites-available/default-ssl.conf

Suchen Sie nach der Option SSLCertificateFile und geben hier das Server Zertifikat an.

SSLCertificateFile /etc/apache2/ssl/server.crt

Mit der Option SSLCertificateKeyFile müssen Sie den privaten Server Schlüssel angeben.

SSLCertificateKeyFile /etc/apache2/ssl/server.key

Ihr Certificate Authority Zertifikat müssen Sie bei der Option SSLCertificateChainFile angeben.

SSLCertificateChainFile /etc/apache2/ssl/ca.crt

Auch bei der Option SSLCACertificateFile wird das Certificate Authority Zertifikat eingetragen.

SSLCACertificateFile /etc/apache2/ssl/ca.crt

Nachdem Sie diese Änderungen vorgenommen und abgespeichert haben, aktivieren Sie mit dem folgenden Befehl die VHost-Konfiguration default-ssl.conf.

pi@raspberrypi ~ $ sudo a2ensite default-ssl.conf
Enabling site default-ssl.conf.
To activate the new configuration, you need to run:
  service apache2 reload

Das SSL-Modul für den Apache2-Webserver müssen Sie noch mit dem folgenden Befehl aktivieren.

pi@raspberrypi ~ $ sudo a2enmod ssl
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
  service apache2 restart

Nachdem Sie die SSL-Unterstützung konfiguriert haben, müssen Sie den Apache2-Daemon neu starten.

Hinweis: Sollten Sie das Passwort des Server-Schlüssels nicht entfernt haben, müssen Sie dieses eingeben bevor der Webserver gestartet wird.

pi@raspberrypi ~ $ sudo /etc/init.d/apache2 restart

Zur Kontrolle ob der Webserver auch auf dem TCP-Port 443 lauscht und so den Zugriff über HTTPS erlaubt, können Sie den folgenden Befehl aufrufen. In der Ausgabe sollten Sie einen entsprechenden Eintrag für den TCP-Port 443 vorfinden.

pi@raspberrypi ~ $ sudo netstat -tulpen
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      109        38035       10595/mysqld    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      0          8660        545/sshd        
tcp6       0      0 :::443                  :::*                    LISTEN      0          52361       13005/apache2  
tcp6       0      0 :::80                   :::*                    LISTEN      0          52357       13005/apache2  
tcp6       0      0 :::22                   :::*                    LISTEN      0          8670        545/sshd        
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           105        8142        337/avahi-daemon: r
udp        0      0 0.0.0.0:68              0.0.0.0:*                           0          8295        544/dhcpcd      
udp        0      0 192.168.10.82:123       0.0.0.0:*                           0          8718        565/ntpd        
udp        0      0 127.0.0.1:123           0.0.0.0:*                           0          8717        565/ntpd        
udp        0      0 0.0.0.0:123             0.0.0.0:*                           0          8709        565/ntpd        
udp        0      0 0.0.0.0:42129           0.0.0.0:*                           105        8144        337/avahi-daemon: r
udp6       0      0 :::5353                 :::*                                105        8143        337/avahi-daemon: r
udp6       0      0 :::54593                :::*                                105        8145        337/avahi-daemon: r
udp6       0      0 fe80::3b8d:3c33:dbe:123 :::*                                0          8720        565/ntpd        
udp6       0      0 ::1:123                 :::*                                0          8719        565/ntpd        
udp6       0      0 :::123                  :::*                                0          8710        565/ntpd

Weiterführende Tutorials

Raspbian Jessie: HTTPS mit Client-Zertifikaten
Raspbian Jessie: Zugriff auf den Apache2-Webserver nur über HTTPS erlauben


Dieser Eintrag wurde am 23.11.2016 erstellt.

Direkter Link zu dieser Seite: http://www.gtkdb.de/index_36_2861.html

[ Zur Startseite ]   [ Zur Kategorie ]


Valid XHTML 1.0 Transitional Valid CSS Valid Atom 1.0

© 2004-2018 by Georg Kainzbauer