Gezielt Meta Properties finden und auslesen

Manchmal kommt es vor, dass man ein spezielles Meta Value braucht und es auslesen will. Wie macht man das? Es gibt ja kein spezielles getElementByMetaName oder getElementByMetaProperty. Bis jetzt! Den wir erstellen uns die Funktion mal selbst. Getreu dem Motto: „Ist das Mädel noch so lieb, Handbetrieb bleibt Handbetrieb!“.

https://www.youtube.com/watch?v=-x_ACSsbum4

Ich stelle Euch drei Varainten vor:

function getMetaContentByName(selector, key) {
    if(selector.length == 0) {console.error(“expect two Property. Given nothing or one!“);return false;}
    if(key.length == 0) {console.error(“expect Property. Given one!“);return false;}
    metas = document.getElementsByTagName("meta")
    for (let i = 0; i<t.length;i++) {
        if (t[i].getAttribute(selector) == key) 
        {
            return t[i].getAttribute("content");
            break;
        } 
    console.log(i);
    }
}

Oder

function getMetaContentByName(selector, key) {
	let metas = document.getElementsByTagName("meta")
	// convert HTMLCollection to an Array
	let _array = Array.from(metas);
	let _result = t1.filter(function(meta) {
		if(meta.getAttribute(selector)) {			
			if (meta.getAttribute(selector) == key) {
				return meta;
			}
		});
	return _result.length >0 ? _result[0].getAttribute("content") : null;
}

Oder

document.querySelectorAll( "meta[name='twitter:title'" )[0].getAttribute("content")

Falls Ihr andere Wege kennt, dann schreibt mir über Kommentar. Grüße!

Ubuntu – Mit Konsole in Dateien suchen

Folgendes Szenario. Ihr habt einen Kunden der noch keine Entwicklungsumgebung für sein Projekt gebaut hat und alle Änderungen seit dem er sein Projekt – in diesem Fall war es ein Shopware Shop – am Livesystem vollzieht. WHHHAAAAATTTTTTTTT!?!? Richtig gelesen – und solche Kunden gibt es viele. Und an dieser Stelle mache ich dem Kunden auch keinen Vorwurf. Jedenfalls wird es hier meine Aufgabe sein, dass ganze mit Kollegen eine anständige Entwicklungsumgebung zu bauen. Aber zurück zur Aufgabenstellung. Erster Tag und ich habe noch nicht meine IDE auf Remote gestellt, da springt mir der erste Bug entgegen. Den mache ich sofort über die Shell. Ein Formular ist Fehlerhaft und ihr möchtet es über SSH rasch fixen. Wie finde ich die Templatedatei wo dieses Formular enthaten ist. Wie ihr vermutet, gibt es auch keine Dokumentation. Wir nutzen die Formular ID (<form id=“buggy-form“ method=“POST“ …>) und suchen mit dem Konsolenprogramm grep.

grep -ril "buggy-form" . 

SchuwpsDieWups – und wir erhalten den Pfad zur Datei.

Dubletten im JS Array finden und löschen

Beim aktuellen Kunden aus der Schweiz, werden die Postleitzahlen über eine CSV geladen und in ein Array gesteckt. Kann man machen aber was nicht geht, dass das CSV über 1000 Dubletten enthält. Also 1000,1000,1000,1000,1000,1000,1001,1001,1002 und so weiter. Meine erste Amtshandlung war die Bereinigung der Dubletten. Dafür habe ich folgendes JS Script geschrieben.

function readCSVFile(file)
{
	var raw = new XMLHttpRequest();
	rawText.open("GET", file, true);
	rawText.onreadystatechange = function ()
	{
		if(rawText.readyState === 4)
		{
			if(rawText.status === 200 || rawText.status == 0)
			{
				let string = rawText.responseText;
				let _arr = string.split(",");
				let arr = eliminateDuplicates(_arr);
				console.log(“string“, arr.toString());
			}
		}
	}
	rawText.send(null);
}

function eliminateDuplicates(arr) {
	let i,
		len = arr.length,
		out = [],
		obj = {};

		for (i = 0; i < len; i++) {
			obj[arr[i]] = 0;
		}
	
		for (i in obj) {
			out.push(i);
	  	}
	
		return out;
}	
		
let csvFile = “dublettenDatei.csv“
readCSVFile(csvFile)

Die Ausgabe habe ich dann in die Konsole geschrieben und somit konnte ich es einfach kopieren um es in die neue CSV Datei dublettenFreieDatei.csv zu kopieren.

Video Dateiengröße verkleinern mit wenig wenig Qualtätsverlust

Juhu – Der nächste Film mit 6 Gigabyte und gleich kommt noch die coole Serie. So läppern sich die Gigabytes auf Gigabytes auf der Festplatte und so weiter. Eine Festplatte ist nun mal endlich und daher kommen die Speicher Probleme ganz von alleine. Wer Filme mag und sie gerne auf der Festplatte zum Abruf bereit hält wird wahrscheinlich das Problem kennen. Schnell wird die Filmleidenschaft zu einem wahrem Speicherfresser. Externe Monsterfestplatten oder hochgerüstete Homeserver sind eine valide Lösung. Allerdings hat sich was die Videokompremierung angeht, einiges getan. So kann man durchaus Videos mit kaum spürbaren Verlust kompremieren.

Dafür gibt es einige Videoconverter am Markt. Einige kosten sogar. Aber im Grunde bauen die meisten Programme mit Oberfläche auf dem Konsolenprogramm ffmpeg auf und sind eigentlich nur eine UI für ffmpeg. Und die gängigsten Sachen kann man eigentlich ganz schnell über die Kommandozeile erledigen.

Ich zeig dir wie Du aus einem 2,6 Gigabyte MP4 Film einen ca. 1 GB MP4 Film machst ohne großartigen Qualitätsverlust.

Wir brauchen das Konsolenprogramm ffmpeg. Checkt mal über eure CLI ob es bei Euch drauf ist.

Mit:

type ffmpeg 
//  oder
which ffmpeg
// output
/usr/bin/ffmpeg

Eine recht stabile Konvertierung hast du mit folgendem Codec und Bitrate:

ffmpeg -i grosser-tatort.mp4 -vcodec libx265 -crf 28 kleiner-tatort.mp4

Ffmpeg ist ein wirklich sehr großes und mächtiges Werkzeug und wenn dich das Thema reizt, rate ich Dir die Dokumentation von ffmpeg anzuschauen. Es gibt auch gute Videos dazu. Wer im Bereich Videobearbeitung unterwegs ist und überlegt auf Linux / Ubuntu zu wechseln empfehle ich Cinelerra oder OpenShot als Videobearbeitungsprogramme. Eventuell kommt dazu hier noch eine Programmvorstellung.

Leaflet.js – Einstieg (Karte erstellen und Marker setzen)

Typisch Büroalltag!

Chef kommt rein und ruft! Moin Mädels! Lasst mal kurz ne Map erstellen, wo wir unser Office mit so einem Marker markieren! Ihr wisst schon. Damit die Kunden sehen, wo wir unser Büro haben. Ich: Klar gib mir 30 Minuten und die Koordinaten vom Büro. Ah ja und den Zoomlevel und natürlich welches Mapdesign . Chef: Ja Ja mach mal, muss bloß schick sein! Chef grinst und geht.

Man nehme ein Standard HTML Gerüst und lade von einem CDN die Leaflet Bibliothek samt CSS Style. Also das kommt in den Header (zwischen head und /head ;-)).

<link rel="stylesheet" href="https://unpkg.com/leaflet@1.6.0/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.6.0/dist/leaflet.js"></script>

Da Chefi nichts gesagt hast, ziehe ich die Karte auf Fullscreen indem ich den Style für #map mit {position:absolute; top: 0; bottom: 0; left: 0; right:0;} definiere und zwar auch im Header.

<style>
	#map {position:absolute; top: 0; bottom: 0; left: 0; right:0;}
</style>

Im Body setze ich ein Div Container der die Map anzeigen soll.

<div id="map"></div>

nun noch ein Script. Mit diesem Script initialisieren wir die Map und setzen die Koordinaten des Büros. Das Script setzen wir vor dem schließendem Body Tag.

<script>
var map = L.map('map').setView([53, 13], 9);
var map = L.map('map').setView([51.26,30.22], 13);

L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
		attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
	}).addTo(map);
// unseren Marker nicht vergessen
	var LeafIcon = L.Icon.extend({
		options: {
			shadowUrl: 'https://leafletjs.com/examples/custom-icons/leaf-shadow.png',
			iconSize:     [38, 95],
			shadowSize:   [50, 64],
			iconAnchor:   [22, 94],
			shadowAnchor: [4, 62],
			popupAnchor:  [-3, -76]
		}
	});

	var greenIcon = new LeafIcon({iconUrl: 'https://leafletjs.com/examples/custom-icons/leaf-green.png'});
	L.marker([51.26,30.22], {icon: greenIcon}).addTo(map);
</script>

Hier der ganze Code:

<!DOCTYPE html>
<html>
<head>
  <title>Simple polygon visualisation</title>
  <meta charset="utf-8" />
  <link rel="stylesheet" href="https://unpkg.com/leaflet@1.6.0/dist/leaflet.css" />
  <script src="https://unpkg.com/leaflet@1.6.0/dist/leaflet.js"></script>
  <style>
  #map {position:absolute; top: 0; bottom: 0; left: 0; right:0;}
  </style>
</head>
<body>
  <div id="map" ></div>

  <script>

	var map = L.map('map').setView([51.26,30.22], 13);

	L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
		attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
	}).addTo(map);

	var LeafIcon = L.Icon.extend({
		options: {
			shadowUrl: 'https://leafletjs.com/examples/custom-icons/leaf-shadow.png',
			iconSize:     [38, 95],
			shadowSize:   [50, 64],
			iconAnchor:   [22, 94],
			shadowAnchor: [4, 62],
			popupAnchor:  [-3, -76]
		}
	});

	var greenIcon = new LeafIcon({iconUrl: 'https://leafletjs.com/examples/custom-icons/leaf-green.png'});

	L.marker([51.26,30.22], {icon: greenIcon}).addTo(map);
  </script>

 </body>
</html>

Ich hoffe Chefi wird glücklich, wenn er das sieht!?!

Laravel Mix – arbeiten mit Sass

Ihr möchtet in eurem Laravel Projekt mit Sass oder Less oder PostCss arbeiten. Kein Problem, dass Zauberwort heißt: Laravel Mix. Geht zuerst in euer Root Verzeichnis eures Laravel Projektes. Dort schauen wir uns die webpack.mix.js mal an.

Wichtig sind jetzt diese Zeilen:

mix.js('resources/js/app.js', 'public/js')
    .sass('resources/sass/app.scss', 'public/css');

Das sagt uns dass wir unsere Sass Dateien alle in den Ordner resource/sass/ packen sollen. Eine Sass Datei ist dort bereits und zwar die app.scss. Danach wird der Zielordner angegeben. Dieser ist public/css. Dort werden dann alle kompilierten Style Dateien kopiert. In diesem Fall dann app.css. Nun möchten wir eine weitere Styledatei names customstyles.css hinzufügen. Mit folgenden Schritten wird das gemacht:

1. Im webpack.mix.js erweitern wir den mix.js um: .sass(‘resources/sass/customstyles.scss’, ‘public/css’);
Also:

mix.js('resources/js/app.js', 'public/js')
    .sass('resources/sass/app.scss', 'public/css')
    .sass('resources/sass/customstyles.scss', 'public/css');

2. Im Ordner Resource/sass erstellen wir eine neue Datei namens: customstyles.scss und schreiben unser Stylecode dort rein.

3. Im HTML Template muss ja die Datei im Header auch eingebunden werden.

Also fügen wir im Header ein:

<link href="{{ asset('css/customstyles.css') }}" rel="stylesheet">

Kompilieren wird über:

3. Kompilieren

npm run dev

Wer nicht ständig bei jeder Änderung ein NPM Command absetzen möchte, kann es hier auch leichter haben mit:

npm run watch

Fertig!

Eine ältere Laravel Version installieren

Vielleicht kennt ihr das? Im Januar hat man sich die neuste Laravel Version gezogen. Etwas rumgespielt und die neuen Feautures getestet. Dann eine zeitlang nichts, weil man ein anderes Projekt hat. Im September des selben Jahres installiert man dann Laravel. Wie immer mit Hilfe des Composers und Bang! Wieso startet das teil nicht und wieso wirft der mir jetzt eine dicke Exeption nach der Anderen.

Wahrscheinlich habt ihr, so wie ich auch, Laravel über den Composer wie folgt geladen:

composer create-project --prefer-dist laravel/laravel meine-app

Hier zieht sich der Composer stets die letzte Version. In meinem Fall war es Larvel 8. Was ich eigentlich gar nicht vor hatte. Und Laravel 8 war so neu, dass ich auch noch nicht wusste, dass Laravel 8 draußen ist. Stackoverflow hatte bisher nur eine Frage zu dieser Exception und diese war nur wenige Stunden alt.

Wollt ihr nun eine spezielle Laravel Version installieren, dann:

composer create-project laravel/laravel="7.*" laravel7

Mit dem Sternchen sagt ihr dem Composer die letzte verfügbare Version von 7. In diesem Fall also 7.24.

PNG zum PDF umwandeln

Wer einige PNG Grafiken hat die er über die Kommandozeile in ein PDF wandeln will, benötigt dafür das mächtige Bildkonvertierungsprogramm convert. Convert ist Standardmäßig auf Ubuntu vorinstalliert. Allerdings muss man hier eins beachten. Convert nutzt für das konvertieren von Bildern, Grafiken zu einem PDF Ghostscript. Ghostscript hatte aber vor Jahren eine große Sicherheitslücke und convert hat darauf hin das Umwandeln von PDFs blockiert. Diese Ghostscript Sicherheitslücke wurde aber bereits seit der Version 9.24 geschlossen. Aber dennoch blockiert convert das Umwandeln von PDFs. Man kann diese Sicherheitsregel aufheben indem man in der ImageMagick-6/policy.xml folgende Zeile auskommentiert:

sudo nano /etc/ImageMagick-6/policy.xml
<policy domain="coder" rights="none" pattern="PDF" />

ändern zu:

<!-- <policy domain="coder" rights="none" pattern="PDF" /> -->

Es geht auch noch schneller, indem wir einfach die policy.xml kurz umbenennen.

sudo mv /etc/ImageMagick-6/policy.xml /etc/ImageMagick-6/policy.xmlAus

sudo mv /etc/ImageMagick-6/policy.xmlAus /etc/ImageMagick-6/policy.xml

Wer möchte kann hier auch ein BashScript schreiben (welches die policy umbenennt und nach erfolgreicher Konvertierung wieder zurückbenennt) und es mit einem Alias ansteuern.

Nun können wir mit:

convert *.png alle.png-dateien.pdf

umwandeln. Oder nur eine einzelnde Datei mit:

convert Grafik.png grafik.pdf

Wer die Policy nicht kurzeitig deaktiviert erhält diese Fehlermeldung:

convert-im6.q16: not authorized `Grafik.pdf' @ error/constitute.c/WriteImage/1037.

Mehrere PDF Dateien zu einem PDF zusammenführen

Um schnell und einfach mehrere PDF Dokumente zu einem Dokument zu verschmelzen braucht man nicht viel. Eigentlich nur die Kommandozeile. Dort steuern wir das Ghostscript an um aus mehreren PDF Dokumenten ein PDF zu erstellen. Ghostscript ist Bestandteil des Druckservers CUPS und sollte somit vorinstalliert sein. Checkt es einfach mit gs -help. Falls Ghostscript nicht gefunden wird, dann installiert es rasch manuell mit:

sudo apt install ghostscript 

Anwendungsbeispiel:

Ihr möchtet alle Betriebskostenabrechnungen der letzten 3 Jahre zu einem Dokument zusammenfügen. Geht zu dem Ordner wo ihr alle Betriebskostenabrechnungen aufbewahrt. Gebt dann ein:

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dAutoRotatePages=/None -sOutputFile=betriebskostenabrechnug-2018-2019-2020.pdf  bk-2018.pdf  bk-2019.pdf  bk-2020.pdf

Wollt Ihr doch alle Betriebskostenabrechnungen zusammenfügen, dann genügt auch einfach:

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dAutoRotatePages=/None -sOutputFile=betriebskostenabrechnug-ALLE.pdf  *.pdf

Um sich das PDF nun anzuschauen, öffnen wir es gleich aus der Kommandozeile mit:

gs -dSAFER -dBATCH betriebskostenabrechnug-ALLE.pdf

Wenn man oft aus der Kommandozeile PDFs öffnen möchte, lohnt sich sogar ein Alias dafür anzulegen.

HTTPS im localhost nutzen

HTTPS ist eine verschlüsselte Variante des HTTP ( Hypertext Transfer Protocols) und bedeutet, dass alle Daten zwischen dem Browser (Client) und dem Webserver verschlüsselt übertragen werden. Also eine sichere Verbindung. Zusätzlich wird überprüft, ob die Kommunikation zwischen Server und Client die richtige ist und sich kein anderer dazwischen gedrängelt hat. Dafür gibt es die Zertifkate.

Bei einem HTTPS Request vom Client an der Server sendet der Server sein Zertifkat gleich mit. Der Client und in diesem Fall der Browser checkt selbstständig in seiner Zertifkate Whitelist, ob das Zertifkate trusty ist. Genau genommen, wird überprüft, ob die Zertifzierungsstelle vertrauenswürdig ist. Falls dies nicht der Fall ist, kommt dann vom Browser eine Meldung wie diese:

Bei einer erfolgreichen Zertifkatsüberprüfung, wird ein temporärer Public Key an den Server zurückgeschickt. Mit dem Key werden die folgenden Datenströme der Sitzung verschlüsselt.

Schritt 1: Wir bauen ein eigenes OpenSSL Zertifikat

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/my-seotheater.key -out /etc/ssl/certs/my-seoetheater.crt

Jetzt musst Du einige Fragen beantworten, die für die Zertifikatsausstellung benötigt werden. Gleich gehe ich noch darauf ein.

Was bedeutet der opensssl Command im einzelnen?

openssl: Das startet das Programm OpenSSL über die Kommandozeile. Mit diesem Tool kannst du Zertifikate anlegen und bearbeiten. Es können mehrere Parameter mitgegeben werden. Folgende Parameter aus dem obigen Command nun im Detail:

  • req: Mit diesem Befehl gibt man an, dass man ein spezielles Zertifizierungsformat nutzen möchten. In unserem Fall den ITU-Standard X.509. Das man jetzt im folgenden gleich näher mit Parameter spezifiziert
  • x509: Das gewünschte Format welches man nutzen möchte zum erstellen des digitalen Zertifikats. x509 ist auch als ISO/IEC 9594-8 bekannt.
  • nodes: Dadurch wird OpenSSL angewiesen, unser Zertifikat nicht mit einem Passwort zu sichern und einfach zu überspringen. Wir brauchen das in unserem bestimmten Fall hier nicht. Ansonsten müssten wir jedes mal beim Serverneustart das Passwort für dieses Zertifikat eingeben.
  • -days 365: Mit -days setzt man die Dauer in Tagen des Zertifikats fest. In unserem Fall ein Jahr (365 Tage).
  • -newkey rsa:2048: Damit wird festgelegt, dass wir gleichzeitig ein neues Zertifikat und einen neuen Schlüssel generieren wollen. Ein sogenanntes Schlüsselpaar. Der Schlüssel ist zum signieren des Zertifikats erforderlich. Da wir diesen noch nicht nicht erstellt haben, machen wir das nun gleichzeitig. Mit rsa:2048 weist man an, mit RSA und 2048 Bit zu verschlüsseln.
  • -keyout: Damit wird OpenSSL mitgeteilt, wohin die erzeugte Datei mit dem privaten Schlüssel, hinterlegt werden soll.
  • -out: Damit weisen wir OpenSSL an, wo er das Zertifkat speichern soll.

Der obige Command mit diesen Optionen, erzeugt uns einen Schlüssel und das dazugehörige Zertifkat. Es werden uns einige Fragen zu unserem Server gestellt. Die Antworten werden in das Zertifikat hinterlegt.

Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:NRW
Locality Name (eg, city) []:Olsberg
Organization Name (eg, company) [Internet Widgits Pty Ltd]:SeoTheater.de
Organizational Unit Name (eg, section) []:SeoTheater.de
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:admin@deine_domain.de

Beiden Dateien (Schlüssel und Zertifikat) werden in den entsprechenden Unterverzeichnissen unter /etc/ssl abgelegt.

2. Schritt: Apache zur SSL Nutzung konfigurieren

Wir werden einige Anpassungen an unserer Konfiguration vornehmen:

  1. Wir werden ein Konfigurations-Snippet erstellen, um die Standard-SSL-Einstellungen festzulegen.
  2. Wir werden die standard SSL-Apache-Virtual-Host-Datei so modifizieren, dass sie auf unser neues selbstgenerierten SSL-Zertifikate verweist.
  3. (Optinal) Wir werden die den virtuellen Hosts so modifizieren, dass die Anfragen automatisch an den verschlüsselten virtuellen Host umgeleitet werden.

Wenn wir damit fertig sind, sollten wir eine gute SSL-Konfiguration haben.

Erstellen der Apache-Konfiguration

Zuerst werden wir ein Apache-Konfiguration erstellen, um einige SSL-Einstellungen zu definieren. Das wird dazu beitragen, unseren Server sicherer zu machen. Die Parameter, die wir einstellen werden, können übrigens von allen virtuellen Hosts verwendet werden, die SSL aktivieren.

Wir erstellen eine Datei im Verzeichnis /etc/apache2/conf-available. Diese Datei bennen wir ssl-params.conf. Der Name sagt ja schon was hier Programm ist.

sudo nano /etc/apache2/conf-available/ssl-params.conf

und kopieren folgenden Snippet rein:

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off

und speichern.

Die Apache SSL Virtual Host Datei anpassen

Als nächstes modifizieren wir die Standard SSL Konfiguration ( /etc/apache2/sites-available/default-ssl.conf ). Bevor wir das tun, kopieren wir die Original Datei zur Sicherheit.

sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.backup

Jetzt gehen wir in die default-ssl-conf mit:

sudo nano /etc/apache2/sites-available/default-ssl.conf

rein. Der Inhalt sollte in etwas so ausschauen:

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

Wir ändern es wie folgt ab:

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin MEINE@EMAIL.com
                ServerName MEINEDOMAIN.DE

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/MEIN_CERT_NAME.crt
                SSLCertificateKeyFile /etc/ssl/private/MEIN_KEY_NAME.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

(Optional) Die HTTP Host File anpassen – Redirect auf HTTPS

Dieser Schritt ist zwar optional aber man sollte diesen aus Sicherheitsgründen nicht überspringen. Mit der aktuellen Einstellung wird der Server eine verschlüsselte und eine unverschlüsselte Verbindung zur Verfügung stellen. Wenn es ein Production Server ist, dann wäre es sehr sinnvoll alle Anfragen automatisch auf HTTPS weiterzuleiten. Falls es wie in unserem Beispiel nur für localhost gelten soll, dann kannst Du diesen Abschmitt getrost übersrpingen.

Dazu gehen wir in die Datei /etc/apache2/sites-available/000-default.conf .

sudo nano /etc/apache2/sites-available/000-default.conf

Innerhalb des VirtualHost Konfigurationsblocks, fügen wir die Weiterleitungs-Direktive hinzu, die den gesamten Traffic auf die SSL Version der Seite weiterleitet.

<VirtualHost *:80>
        . . .

        Redirect "/" "https://deine-domnain-oder-ip/"

        . . .
</VirtualHost>

Und speichern.

Schitt 3 – Die Firewall einstellen

Wenn Du ufw-Firewall aktiviert hast, musst Du gegenbenfalls bei den Einstellung etwas anpassen um den SSL Traffic durchzulassen. Apache registriert bei der Installation bereits einige Profile bei der Firwall.

sudo ufw app list
Available applications:
  Apache
  Apache Full
  Apache Secure
  CUPS
  OpenSSH

Ob Deine Firwall aktiv ist, checkst Du mit:

sudo ufw status

Jetzt kannst Du mit den zwei Commands die Firwall anpassung vornehmen:

sudo ufw allow 'Apache Full'
sudo ufw delete allow 'Apache'

Schritt 4 – Mach die Änderungen jetzt aktiv

Nun, da wir unsere Änderungen vorgenommen und unsere Firewall angepasst haben, können wir das Apache SSL-Module aktivieren und den Server neustarten.

Die benötigten Module (mod_ssl, mod_headers) aktivieren wir mit:

sudo a2enmod ssl
sudo a2enmod headers

Als nächstes machen wir den SSL Virtual Host mit a2ensite verfügbar.

sudo a2ensite default-ssl.conf

Dann müssen wir noch unsere ssl-params.conf Datei mit verfügbar machen.

sudo a2enconf ssl-params

Ab diesem Moment sind alle benötigten Module verfügbar. An dieser Stelle empfiehlt sich noch ein Konfiguartions-Syntax check durchzuführen. Das geht ganz einfach mit:

sudo apache2ctl configtest

Wenn keine Syntaxfehler gefunden wurden, erhälst Du in etwa diese Meldung hier:

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK

Wir sind nun soweit. Wir starten zum Schluss noch den Server neu mit:

sudo systemctl restart apache2

Schritt 5 – HTTPS Testing

Öffne ein Browserfenster und gebe Deine locale Testdomain ein. In meinem Fall wäre es https://localhost

Weil unser selbsterstellte Zertifkat nicht vertrauensvoll ist, erhalten wir folgenden Warnhinweis des Brwosers. Das ist an dieser Stelle total harmlos und auch richtig. Wir klicken auf Erweitert und füge für diesen Fall eine Ausnahmegenehmigung hinzu.

SeoTheater Autoren