Apache2 Stand der Seite : 01.12.2017

Diese Seite zeigt Kurzübersicht von einigen Kommandos für die Konfiguration von Apache2 und seine Verzeichnisse, um einen Virtual-Host aufzusetzen.
Danach die Installation eines lokalen Zertifikat zu Testzwecken und ein Script zur Erzeugung eines virtual Host.

Apache2 Control

 apache2ctl -t -D DUMP_MODULES  # Zeigt alle Module
 apache2ctl -M	# Zeigt alle Module an mit den
   		#  Werten static bzw. shared an.
 a2enmod   <modulname> 	# Aktiviert das Modul
 a2dismod  <modulname> 	# Deaktiviert das Modul
   
 service apache2 restart	# Started Apache neu
 
 a2dissite detlef		# Site detlef disablen.

 # Um die neu Konfiguration zu aktivieren, 
 # muß reload ausgeführt werden
 systemctl reload apache2

 
 
 # im Fehlerfall geben diese Kommandos detailierte 
 # Auskunft.
 systemctl  status apache2.service  
 journalctl  -xe
   

Verfügbare Module anzeigen

    
root@i7-graf-st-dh:~# apache2ctl -M
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, 
using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
Loaded Modules:
 core_module (static)
 so_module (static)
 watchdog_module (static)
 http_module (static)
 log_config_module (static)
 logio_module (static)
 version_module (static)
 unixd_module (static)
 access_compat_module (shared)
 alias_module (shared)
 auth_basic_module (shared)
 authn_core_module (shared)
 authn_file_module (shared)
 authz_core_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 expires_module (shared)
 filter_module (shared)
 mime_module (shared)
 mpm_prefork_module (shared)
 negotiation_module (shared)
 php7_module (shared)
 reqtimeout_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 status_module (shared)
 

Aktivierte Module anzeigen

root@i7-graf-st-dh:~# 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:
  systemctl restart apache2
root@i7-graf-st-dh:~# 

Apache2 Directories

root@i7-graf-st-dh:~$ ll /etc/apache2/
insgesamt 48
-rw-r--r-- 1 root root  7769 Dez  3 16:13 apache2.conf
drwxr-xr-x 1 root root   266 Mär  9 13:41 conf-available
drwxr-xr-x 1 root root   222 Mai 27  2017 conf-enabled
-rw-r--r-- 1 root root  1780 Mai  8  2017 envvars
-rw-r--r-- 1 root root 31063 Jan 25  2017 magic
drwxr-xr-x 1 root root  3804 Mär 11 09:26 mods-available
drwxr-xr-x 1 root root   910 Dez  1 17:58 mods-enabled
-rw-r--r-- 1 root root   320 Jan 25  2017 ports.conf
drwxr-xr-x 1 root root   130 Mär  9 13:40 sites-available
drwxr-xr-x 1 root root    76 Dez  3 18:35 sites-enabled
drw------- 1 root root   112 Dez  2 11:48 ssl
root@i7-graf-st-dh:~$ 
       

Apache2 Files

/etc/apache2/mods-available     
/etc/apache2/mods-enabled  
       
Das Verzeichnis mods-available enthält für jedes Apache2 Modul eine Datei <modulname>.load
und manchchmal auch noch <modulname>.conf
In /etc/apache2/mods-enabled steht für jedes aktivierte Modul ein Symbolic Link auf die Datei in /etc/apache2/mods-available
Beispiel für ssl :

/etc/apache2/mods-available

-rw-r--r-- 1 root root 3110 Jan 25  2017 ssl.conf
-rw-r--r-- 1 root root   97 Jan 25  2017 ssl.load

/etc/apache2/mods-enabled

lrwxrwxrwx 1 root root 26 Dez  1 17:58 ssl.conf -> ../mods-available/ssl.conf
lrwxrwxrwx 1 root root 26 Dez  1 17:58 ssl.load -> ../mods-available/ssl.load

Virtueller Host

Änderungen in sites-enabled/uschi.conf

       DocumentRoot /data/dom_st_michel

        # Servername muss per /etc/hosts oder DNS auflösbar sein 
       ServerName uschi

Änderungen in /etc/hosts

Der Hostname soll lokal aufgelöst werden.
 
root@i7-graf-st-dh:/etc/apache2/sites-available# cat /etc/hosts
127.0.0.1	localhost  i7-graf-st-dh

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

/etc/host mit Editor der Wahl editieren (hie nano)

root@i7-graf-st-dh:/etc/apache2/sites-available# nano /etc/hosts
  127.0.0.1	localhost  i7-graf-st-dh  uschi

Prüfung ob Zugriff möglich

root@i7-graf-st-dh:/etc/apache2/sites-available# ping uschi
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.040 ms
^C
--- localhost ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2035ms
rtt min/avg/max/mdev = 0.029/0.036/0.040/0.007 ms
root@i7-graf-st-dh:/etc/apache2/sites-available# 

Site für Apache aktivieren

root@i7-graf-st-dh:/etc/apache2/sites-enabled# ln -s  ../sites-available/uschi.conf  uschi.conf
root@i7-graf-st-dh:/etc/apache2/sites-enabled# ll
insgesamt 8
lrwxrwxrwx 1 root root 35 Mai  8  2017 000-default.conf -> ../sites-available/000-default.conf
lrwxrwxrwx 1 root root 29 Dez  1 12:15 uschi.conf -> ../sites-available/uschi.conf
root@i7-graf-st-dh:/etc/apache2/sites-enabled# 

Ein Zertifikat für den lokalen Server installieren

Webseiten werden heute häufig per https angesprochen.
Damit das auch bereits lokal getestet werden kann, müssen keys und Zertifikate erstellt werden.
Bevor der Apache per https angesprochen wird, sollte sichergestellt sein, daß ein normaler Verkehr über http möglich ist.

Prüfen ob openssl bereits installiert ist

Es werden hier nur die bereits installierten Pakete angezeigt.
root@i7-graf-st-dh:# aptitude search openssl
                                                 
i A libcrypt-openssl-bignum-perl          - Perl-Modul für den Zugriff auf OpenSSL-Arithmetik-Bibliotheken ... 
                               
i A libcrypt-openssl-rsa-perl              - Modul für RSA-Verschlüsselung mittels OpenSSL                        

i A openssl                                - Werkzeugsatz für das Secure Socket Layer (SSL) - Kryptographiewerkzeu
v   perl-openssl-abi-1.1                                       -                                                                      
i A perl-openssl-defaults                  - Grundlinie zur Versions-Kompatibilität für Perl-OpenSSL-Pakete       

root@i7-graf-st-dh:/data/htdocs# 
 

Falls noch nicht installiert :
root@i7-graf-st-dh:# aptitude install open ssl
oder
root@i7-graf-st-dh:# apt-get install openssl

Verzeichnis /etc/apache2/ssl erzeugen ;
root@i7-graf-st-dh:# mkdir /etc/apache2/ssl
in dem Verzeichnis werden die Keys abgelegt
root@i7-graf-st-dh:/etc/apache2# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt
Generating a 2048 bit RSA private key
.....................+++
.......................+++
writing new private key to '/etc/apache2/ssl/apache.key'
-----
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]:Hessen
Locality Name (eg, city) []:Ruesselsheim
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DetlefHahn
Organizational Unit Name (eg, section) []:Funkschein
Common Name (e.g. server FQDN or YOUR name) []:detlef
Email Address []:webmastern@localhost
root@i7-graf-st-dh:/etc/apache2# ll ssl
insgesamt 4
-rw-r--r-- 1 root root 1484 Dez  1 17:03 apache.crt
-rw------- 1 root root 1704 Dez  1 17:01 apache.key
root@i7-graf-st-dh:/etc/apache2# 

Erzeugtes Zertifikat anzeigen lassen

root@i7-graf-st-dh:/etc/apache2/sites-available# openssl x509 -in /etc/apache2/ssl/apache.crt -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            f3:25:b6:7c:63:0f:0c:6b
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = DE, ST = Hessen, L = Ruesselsheim, O = DetlefHahn, OU = Funkschein, CN = detlef, emailAddress = segeln@detlefhahn.de
        Validity
            Not Before: Dec  1 16:19:11 2017 GMT
            Not After : Dec  1 16:19:11 2018 GMT
        Subject: C = DE, ST = Hessen, L = Ruesselsheim, O = DetlefHahn, OU = Funkschein, CN = detlef, emailAddress = segeln@detlefhahn.de
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:f8:db:2a:9a:e2:3a:58:33:84:3b:d5:dc:93:38:
                    6c:3f:06:13:f3:cb:08:40:d3:1f:a3:3a:f9:3d:ea:
                    cf:12:7f:f1:a3:d3:8e:29:94:6c:4c:64:10:f8:92:
                    51:9c:a0:78:75:c1:95:3f:b9:c6:d5:85:d6:6e:24:
                    36:ca:08:8b:a4:f9:59:87:48:88:e0:b7:13:0f:cb:
                    d9:d7:dc:4a:30:64:6a:f4:0d:a6:29:fc:a6:b9:ba:
                    01:e0:d4:a7:59:54:8d:ac:a7:b9:39:75:ac:4a:6f:
                    e2:27:8c:df:32:61:e6:61:4f:6d:a3:3b:d1:3a:5f:
                    78:f9:65:5f:84:54:70:2f:88:12:fc:ae:90:aa:f1:
                    7c:87:0d:8c:a2:64:ac:9f:c4:ac:4b:77:86:83:73:
                    d0:93:c2:dd:5a:bd:b6:9b:df:11:47:42:e8:7b:e6:
                    ae:c9:72:6a:66:ee:1c:94:5d:75:0b:31:96:fc:d3:
                    ca:de:7e:ee:c1:c4:de:6f:51:44:ab:2e:09:6b:01:
                    c3:fd:46:53:10:ef:db:5a:ea:7b:da:2e:a5:3d:32:
                    c4:78:98:ed:dc:b5:19:66:1b:15:fa:89:54:b4:9e:
                    61:2c:78:93:57:7b:29:f9:9f:2d:21:5a:de:45:20:
                    c9:44:33:01:cb:0c:c6:66:de:57:6b:a2:6c:dd:8b:
                    e5:eb
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                E9:06:26:B9:69:D0:8F:2F:AD:82:1A:B4:F7:EF:12:C6:C8:95:72:78
            X509v3 Authority Key Identifier: 
                keyid:E9:06:26:B9:69:D0:9F:2F:5D:82:1A:E4:F7:EF:15:C6:C8:95:72:78

            X509v3 Basic Constraints: critical
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         2a:b4:92:09:ff:11:40:ca:2d:bc:a1:ee:67:5a:31:b2:f6:f9:
         05:bb:45:ad:8f:1f:c0:fd:01:d7:3e:80:6f:d4:9a:44:e2:e9:
         ca:37:0f:9c:21:4d:4d:d7:c3:d7:56:16:31:dc:f9:8e:1e:c5:
         f7:10:a2:3f:50:27:8f:40:35:cd:9d:98:c1:b9:e7:c9:a3:5a:
         ae:db:96:9d:9f:2b:a5:ec:65:cd:87:32:7b:db:8b:4a:e4:1f:
         87:2e:27:27:39:c7:cc:9c:cc:b3:0a:cc:d3:0d:04:ad:ca:ae:
         a9:95:c9:ef:99:ee:43:1a:45:f1:3c:7f:85:62:46:08:b4:db:
         1e:45:c0:4c:bc:7c:59:ed:a2:a8:6e:96:cd:6e:bc:5f:58:47:
         3b:62:dc:7f:3b:8e:31:4a:6b:0a:62:ba:79:80:19:07:a7:69:
         04:9a:b1:61:fd:c9:03:2b:a4:5e:ce:20:6c:1a:1c:75:5b:06:
         ab:5f:f7:eb:b2:e4:6a:8c:dc:d5:e6:32:76:30:cc:f7:c6:4d:
         5d:4f:05:88:96:b4:3c:ed:82:a6:a3:9a:cc:05:5e:73:46:e2:
         58:6a:06:5a:b9:66:a0:ba:1c:b7:15:ee:46:c3:71:fa:a4:94:
         62:eb:0e:0b:d2:23:a3:9b:4d:95:ed:c3:4e:7b:a3:36:4a:e3:
         3b:7b:69:19
root@i7-graf-st-dh:/etc/apache2/sites-available# 

Key anzeigen
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD42yqa4jpYM4Q7
1dyTOGw/BhPzywiQ0x+jOvk96s8Sf/Gj044plGxMZBD4klGcoHh1wZU/ucbVhdZu
JDbKCIuk+VmGSIjgtxMPy9nX3EowZGr0DaYp/Ka5ugHg1KdZVI2sp7k5daxKb+In
jN8yYeZhT22jO9E6X3j5ZV+UVHAviBL8rpCq8XyHDYyiZKyfxKxLd4aDc9CTwt1a
vbab3xFHQuh75q7Jcmpm7hyUXXULMZb808refu7BxN5vUUSrLglrAcP9RlMQ79ta
6nvaLqU9MsR4mO3ctRlmGxX6iVS0nmEseJNXeyn5ny0hWt5FIMlEMwHLDMZm3ldr
omzdi+XrAgMBAAECggEARUiPdguh/sho+leyT3KYAHvqtidCvT9qQYG7vpdPC3F/
jwLpQ35FIIeDihECk77BitdYfCN2zh+y8Xs3ncv/RPD/EbnEEfwmXHF+tvBn3001
0bizGGF08aRtvXC3HtHBl94iXXL7gsXfiu9yfKlxAIqilZ2jxMKr5ZNpptxTV4fY
Y9l9U/9KzlMZf3ec//+cstr2I9qLWj0lqCFQEsNnxLbrqsV8h8XIX1TAuq8C/D3T
z4vrx5ZFgQywH2V119kJQczNY7nohT4FK2TATzAsWNPr2VJMgQ5Oe0qZDZYWPUI7
h7GLTwkEq/RtuDz/s/fAOhcVpRVaHyMrDNg+Y7RrYQKBgQD/TZUOG1Vj+8XnbD3i
fM831rJl3CwGtTLJVp1Vod+i0/u2XdEFqqHySgHUU3HIHkh6t8QZgQQ+xOjnodOp
BruWo12E92QxF00i83e2BALLgIue8icCLvW0J9C9mWJNO7NWaUWwSSRFkzZM2YKD
kPp/xfV2xv9II+TL5EBBZlECCQKBgQD5iRQpclVe+381YXZHmjy/fArmsjbvYDm1
Q7LwMtQZDyWhKLQaPpMumxG29kEKoaPFZuDliY/xPSwW9Zh5FLwQlTcZuPpm55zn
62RaiEufPm5Xe/noCjJzrBsV9OfIQp0T4iKKmYuREsz5W5cHfUxANPuhr8y9XSM2
gQYHRJGVUwKBgGZdEAeg9ALrvzUEFGgMTPWBkvP+bHSgEGXj4Z+lEMrznfhH83gH
K3m/LK6aaoOniL4Tkn/7V91nDE9bdkdOWMaUZ/nZS4XXZuk9n2EOiKRZvSGUzAk3
FPMQB8UNi/mVl1ltSjDdkrqGxP3ZNFhWN+olUD84mMCvC5yovw653H8pAoGBANa4
HrI/YLiXfnGniMi6LnWyvgqe5Wh7i4yvUWUgx6M8hmuzg65lk+5xnv+pzHPifPLa
wMCi60pxEeQ7ttTRg7ZdP4mRw14TBNAHnFXOnAvOA9KhqnwBckJYoQH2uA95SoKW
fpR25UKTQ+954W6fYaKKNNB/XpS/dRJsWYydcwxjAoGBAPWqe7htMsQm/GViT0ss
4YADtRt4KRVA3+q36XL3aXvro1137EHEnqm59KQ52XwBqGfSdXV9CnNJp6PzfKcS
Pyb6Glj2tVXm65y/2AdvInN57IinEiPpIdyxutHBp8RfeDNpVZI4FSMogdtpU6UE
QycbTaTeJ8kPruJWp38Zi6bJ
-----END PRIVATE KEY-----

# NameVirtualHost detlef:443   # ist deprecated und sollte nicht mehr verwendet werden

        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
		#  1.) die SSLEngine wird aktiviert und 
		#  2.) die Filename für die Zertifikate werden angegeben
        SSLEngine On
        SSLCertificateFile /etc/apache2/ssl/apache.crt
        SSLCertificateKeyFile /etc/apache2/ssl/apache.key       

#       DocumentRoot /var/www/html
		# Das Verzeichnis für DocumentRoot können Sie natürlich auch woanders hinlegen.
        DocumentRoot /data/detlef

        #d.h.  Der  Servername muss per /etc/hosts oder DNS auflösbar sein 
        ServerName detlef

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        # separate Logfile
        ErrorLog ${APACHE_LOG_DIR}/detlef_error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf

                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Require all granted
        #        Order allow,deny     #deprecated
        #        allow from all

============================================================================================================= Falls mehrere virtuelle Hosts angelegt werden, kann es sinnvoll sein, unterschiedliche Zertifikate zu erzeugen. Hier werden die Dateien mit dem Namen des Hosts (sailing) angelegt
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache_sailing.key -out /etc/apache2/ssl/apache_sailing.crt
Generating a 2048 bit RSA private key
...........+++
..............................................................................................................................+++
writing new private key to '/etc/apache2/ssl/apache_sailing.key'
-----
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]:Hessen
Locality Name (eg, city) []:Ruesselsheim
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DetlefHahn
Organizational Unit Name (eg, section) []:Segeln        
Common Name (e.g. server FQDN or YOUR name) []:sailing
Email Address []:webmaster@localhost
root@i7-graf-st-dh:/data# 

root@i7-graf-st-dh:/data# ll /etc/apache2/ssl/
insgesamt 16
-rw-r--r-- 1 root root 1452 Dez  1 17:19 apache.crt
-rw------- 1 root root 1704 Dez  1 17:17 apache.key
-rw-r--r-- 1 root root 1440 Dez  2 11:48 apache_sailing.crt
-rw------- 1 root root 1704 Dez  2 11:46 apache_sailing.key
root@i7-graf-st-dh:/data# 

/etc/apache2/sites-available/detlef.conf

Namensauflösung

Damit der Virtual Host ohne DNS Eintrag funktioniert, muß die Datei /etc/hosts und evtl /etc/host.conf angepasst werden. In /etc/hosts muss der Name des Virtual Hosts zur IP 127.0.0.1 hizugefügt werden.
cat /etc/hosts
127.0.0.1	localhost detlef i7-graf-st-dh  

 
root@i7-graf-st-dh:/data/detlef# ll -a
insgesamt 40
drwxr-xr-x 1 www-data detlef    48 Dez  1 17:51 .
drwxr-xr-x 1 root     root     486 Dez  1 17:37 ..
lrwxrwxrwx 1 root     root      16 Dez  1 17:45 common -> ../htdocs/common
-rw-r--r-- 1 root     root    2210 Dez  1 17:39 .htaccess
-rw-r--r-- 1 root     root   15719 Dez  1 17:51 index.php
root@i7-graf-st-dh:/data/detlef# 

/etc/host.conf

In /etc/host muß multi auf on gesetzt werden.
multi  Gültige Werte sind on und off. Wenn es auf on gesetzt ist,  gibt
       die  Resolverbibliothek  alle  für  den  gesuchten Host gültigen
       Adressen aus /etc/hosts zurück, anstatt nur  des  ersten.  Stan‐
       dardmäßig  ist  dies auf off gesetzt, da es einen beträchtlichen
       Leistungsverlust auf Sites mit großen Hosts-Dateien verursacht.
cat /etc/host.conf

multi on
Da neuere Web-Browser den Begriff "sailing" an eine Suchmaschine weiterleiten ist zum Aufrufen das geforderte Protokoll mit anzugeben. Zum Beispiel: https://sailing/index.php

Shellscript zur Erzeugung eines virtual Host mit Seitenzugiff über https

#!/bin/bash

UUP=`tput cuu1`         # move the cursor up 1 lin1
clr_eos=`tput ed`       # clear to end of screen
clr_eol=$(tput el)      # clear to end of line

bold=`tput bold`        # fett
norm=`tput sgr0`        # normal
rev=`tput rev`          # revers

blue="\033[37;44m"      #weiß auf blau   
red="\033[37;41m"       #rot auf silber
rot="\033[47;31m"
grev="\033[39;42m"      # gruen und rev
grey="\033[30;47m"      # schwarz auf grau 
#norm="\033[0m"
#bold="\033[1m"

# --------------------------------------------------------------------
# Functions muessen vor der Verwendung deklariert werden
# --------------------------------------------------------------------
function prompt_jn() {
  i=0 
  while  echo -n "$1  (j/n) "
    read antw
  do
     case $antw in
      j|J) return 0   ;;
      n|N) return 1   ;;
      *)  echo "Wer lesen kann ist klar im Vorteil"
          (( i = i + 1 ))
          if [[ $i -gt  3 ]]
          then
             echo "hoffnungslos! wir geben auf"
             exit 1

           fi
          ;;
       esac
  done 

}

#
function cont() {
        
        read -p "Fortsetzung durch  " dummy
        if  [ $? == 1 ] || [ "${dummy}" == "q" ]
        then
                exit 1
        fi
        echo -n "${CUUP}${CLR_EOS}"
     
} 


function prompt_jn() {
  i=0 
  while  echo -n "$1  (j/n) "
    read antw
  do
     case $antw in
      j|J) return 0   ;;
      n|N) return 1   ;;
      *)  echo "Wer lesen kann ist klar im Vorteil"
          (( i = i + 1 ))
          if [[ $i -gt  3 ]]
          then
             echo "hoffnungslos! wir geben auf"
             exit 1

           fi
          ;;
       esac
  done 

}


# --------------------------------------------------------------------
# Ende der  Functions  
# --------------------------------------------------------------------


# Check ob   ROOT   
uid=$(id -u)
if [ $uid -ne 0 ] ; then 
   echo -e ${rot}${clr_eol} " Nur root darf dieses script ausführen" ${norm}
   echo -e ${rot}${clr_eos} " Zugriff verweigert" ${norm}
   exit;
fi   



# Das Script erzeugt die Files für einen Virtual-Host
# Das Verzeichnis und der Hostname ist identisch



# Defaults anlegen
virt_host_name=sailing       #default

# apache_user und apache_run_user müssen mit den Einträgen in /etc/apache2/envvars übereinstimmen 
apache_user=detlef
apache_run_user=www-data

time=730
# Achtung  statt /data könnte auch /var/www  als apache_root verwendet werden
a2root=/data/

# Verzeichnis für den virtual host
vhost_dir=sailing
 

# Übernahme der Parameter.  Reihenfolge der Eingabe beliebig.
# jeder nicht angegebene Parameter  wurde vorher mit einem Default vorbesetztll   
while getopts h:u:r:d:   opt
  do  
     echo $opt "  " $OPTARG
     case $opt in
      
     h)  virt_host_name=$OPTARG
         ;; 
     u)  apache_user=$OPTARG
         ;; 
     r)  apache_run_user=$OPTARG
         ;;
     d)  vhost_dir=$OPTARG
         ;;
     t)  time=$OPTARG
         ;;
    :)   echo "Parameter fuer Option $OPTARG  fehlt"
         exit
         ;;
     ?)  echo " Unbekannte Option " $OPTARG  
         exit
         ;; 
  esac
done

echo ====== Parameter wurden übernommen  ==============
echo

# Prüfen ob Zielverzeichnis für virt-host existiert

if [ ! -d ${a2root}${virt_host_name} ] ; then
	mkdir ${a2root}${vhost_dir}
	chown ${apache_run_user}:${apacher_user}  $a2root${vhost_dir}
fi


# Ist der Name des virtual Host bereits in /etc/hosts
# 
grep ${virt_host_name} /etc/hosts
if [ $? -eq  1 ] ; then 
   sed -e  '1,$ s/localhost/localhost sailing/' /etc/hosts >/tmp/hosts
   cat /tmp/hosts
   prompt_jn "Datei nach /etc/hosts übernehmen ?"
   if [ $?  -eq  0 ] ; then
	cp /tmp/hosts  /etc/hosts
   fi
   echo 
fi

# multi on an in /etc/host aktivieren
grep "multi on" /etc/host
if [ $? -eq  1 ] ; then 
  echo "multi on" >> /etc/host
fi
cat  /etc/host
echo
ll
# Verzeichnis für Zertifikate anlegen falls noch nicht vorhanden
if [ ! -d /etc/apache2/ssl ] ; then
	mkdir /etc/apache2/ssl
fi

# Erzeuge Zertifikat und private key files
openssl req -x509 -nodes -days ${time} -newkey rsa:2048 -keyout /etc/apache2/ssl/apache_${virt_host_name}.key -out /etc/apache2/ssl/apache_${virt_host_name}.crt
chmod 600   /etc/apache2/ssl

prompt_jn "Privat Key anzeigen ? "
if [ $? -eq 0 ] ; then
	echo "/etc/apache2/ssl/apache_${virt_host_name}.key"
	less /etc/apache2/ssl/apache_${virt_host_name}.key
fi

prompt_jn "Zertifikat anzeigen ? "
if [ $? -eq 0 ] ; then
	openssl x509 -in /etc/apache2/ssl/apache_${virt_host_name}.crt -noout -text
fi


# Erzeugen der xxx.conf Datei   in /etc/apache2/sites-available/
# Kommentare wurden hier wegelassen.
# Für kommentierte Datei   siehe /etc/apache2/sites-available .
#
cat > /etc/apache2/sites-available/${virt_host_name}.conf << EOF

        
                ServerAdmin webmaster@localhost

		#  DocumentRoot /var/www/html
                DocumentRoot ${a2root}${virt_host_name}

		ServerName ${virt_host_name}

		# Errors in separater Logdatei
		ErrorLog ${APACHE_LOG_DIR}/error_${virt_host_name}.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

		#   SSL Engine Switch:
                #   Enable/Disable SSL for this virtual host.
                SSLEngine on

		SSLCertificateFile      /etc/apache2/ssl/apache_${virt_host_name}.crt
                SSLCertificateKeyFile   /etc/apache2/ssl/apache_${virt_host_name}.key

		
			Options Indexes FollowSymLinks MultiViews
                	AllowOverride All
		

        


# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

EOF


# SSL Modul in Apache aktivieren. Der Apache muß danach (am Ende) neu gestartet werden
apache2ctl -M | grep modssl
if [ $? -eq 0 ] ; then
	a2enmod  ssl
fi

# Den Virtual Host aktivieren das erzeugt einen Symbolic Link in /etc/apache2/sites-enabled
a2ensite   ${virt_host_name} 

#Anstelle a2ensite  kann auch ein Symbolic Link direkt in /etc/apache2/sites-enabled
# erzeugt werden. Z.B.
# cd /etc/apache2/sites-available; 
# ln -s /etc//etc/apache2/sites-enabled/${virt_host_name}.conf  ${virt_host_name}.conf
# cd -

systemctl restart apache2 



Nachdem der virtual Host nun ohne Fehler (hoffentlich) aufgesetzt ist, kann er jetzt im Broser angesprochen werden.
Dabei ist zu beachten, daß das Protokoll https:// vor dem hostname anzugeben ist.
https://sailing/index.php

Der Browser (Firefox) antwortet mit einer Warnung und weigert sich die Datei zu laden.
Das ist OK, denn er kennt ja das Zertifikat nicht und da es ein selbsterzeugtes Zertifikat ist,
ist es für den Browser nicht vertrauenswürdig.
Zunächst erscheint nur der obere Teil der Warnung. Da wir unserem eigenen Zertifikat ja trauen und es in unserer Testumgebung benötigen, werden wir es akzeptieren und als Ausnahme hinzufügen

Wir klicken auf 'Erweitert' und erhalten auch den unteren Teil der Meldung.


Wir klicken auf Ausnahme hinzufügen.
Wir lassen jetzt den Browser das Zertifikat herunterladen und aktivieren die Checkbox "Ausnahme dauerhaft speichern".

Zuletzt Klicken wir dann auf "Sicherheits-Ausnahmeregel bestätigen".
Damit sollte diese Abfrage beim nächsten Aufruf nicht mehr erscheinen.

Zertifikat prüfen

Sie können ein Zertifikat prüfen, in dem Sie sich die Informationen anzeigen lassen die der Browser für das Zertifikat gespeichert hat.
In der Adresszeile sehen Sie ein Schloßsymbol. Das kann grün oder nur wie in unserem Fall halbgrün sein.

Ein grünes Schloß kennzeichnet eine sichere Verbindung.
Ein halbes grünes Schloß zeigt eine vom Browser als nicht sicher gehaltene https Verbindung an.
Das kann verschiedene Ursachen haben. U.U. wurde ein Bild mit http:// statt https:// geladen.

Sie können sich die Daten des Zertifikats anzeigen lassen, indem Sie auf das Schloß klicken.
Es erscheint der Hinweis, das die Verbindung nicht sicher ist. Dort klicken Sie auf > und dann auf weitere Informationen
Jetzt erscheint der Sicherheitsteil des Browsers. Dort klicken Sie auf Zertifikat anzeigen.


In dem Reiter Details können Sie sich ein Vielzahl von Informationen anzeigen lassen. Hier sehen Sie die Informationen zum Aussteller.




Have fun Detlef