Die Website soll als Portfolio für meine privaten Projekte dienen.
Ich selbst bin kein großer Schreiber, deshalb wird sie automatisch aus meinem Gitlab aufgebaut.
Sie selbst dient auch gleich als Projekt, um meine Kenntnis in Symfony zu erweitern
und mehr Erfahrung mit c# zu bekommen.
Warum C# 😀 siehe.
Alexander Malk E-Mail: alex@guerilla-coding.com
Es gibt derzeit 13 Projekte in 4 Kategorien. Das zuletzt Aktualisierte Project ist Gitlab/Folder Exporter in der Kategorie C# und es wurde am 03.11.2026 aktualisiert.Es warten z.Zt. noch ca. 0 Projekte eingefügt zu werden.
Das Cert Tool ist ein modulares Node.js Tool, mit dem du dir automatisch SSL/TLS Zertifikate von Let's Encrypt holst und sie direkt an beliebig viele Ziele verteilst - zum Beispiel per SSH auf einen Server, als PFX-Datei (z.B. für Jellyfin) oder direkt in eine OPNsense Firewall.
Alles läuft selbstständig im Hintergrund: Das Tool prüft von alleine, ob eine Erneuerung überhaupt nötig ist, holt sich bei Bedarf ein neues Zertifikat per DNS-01 Challenge und informiert dich am Ende per Mail oder Konsole über den Verlauf. 🚀
Der komplette Ablauf ist in einzelne Bausteine aufgeteilt (Trigger, Input, Middleware, Output, Notification). Jeder Baustein lässt sich einzeln austauschen, kombinieren oder erweitern.
Die Module werden automatisch anhand ihres Namens geladen wenn sie sich im richtigen Ordner befinden. Jedes Modul benötigt vor definierte Methoden (Trigger z.B. run()).

Input → Options → Middleware konfiguriert.renewAfter)*.domain.tld) per DNS-01 ChallengeJedes Modul wird in der Config über module (Dateiname/Ordnername) ausgewählt und bekommt seine eigenen options mitgegeben. Welche Felder options jeweils unterstützt, steht bei jedem Modul unten in der jeweiligen Options-Tabelle.
Bestimmt, wann ein Lauf gestartet wird. Liegt als Array direkt unter trigger.
| Modul | Beschreibung |
|---|---|
now |
Führt den Lauf sofort einmal aus. |
cron |
Führt den Lauf wiederkehrend nach einem Cron Zeitplan aus. |
nowKeine - das Modul braucht keine Optionen.
cron| Parameter | Beschreibung |
|---|---|
execution |
Cron-Ausdruck, nach dem der Lauf wiederholt wird, z.B. "0 5 * * 7" für jeden Sonntag um 5 Uhr. |
Beschafft das Zertifikat. Liegt als einzelnes Objekt unter input.
| Modul | Beschreibung |
|---|---|
acme_dns |
Holt bzw. erneuert ein Zertifikat direkt über eine ACME Bibliothek per DNS-01 Challenge bei Let's Encrypt. Unterstützt Wildcards und kann über skipCreation auch einfach nur ein bereits vorhandenes Zertifikat einlesen. |
certbot |
Alternative, die auf das certbot Tool des Systems zurückgreift. |
ℹ️ Wichtig: Die Middleware Module gehören zum Input Modul und werden nicht auf oberster Ebene konfiguriert, sondern unter
input.options.middlewareals Array eingetragen - alsoInput→Options→Middleware.
acme_dns| Parameter | Beschreibung |
|---|---|
domain |
Die Hauptdomain, für die das Zertifikat ausgestellt wird. |
wildcard |
Wenn true, wird zusätzlich *.domain als Wildcard mit ins Zertifikat aufgenommen. |
email |
E-Mail Adresse, die beim Let's Encrypt Account hinterlegt wird. |
directoryUrl |
ACME Directory URL, z.B. das Produktiv- oder Staging-Directory von Let's Encrypt. |
outputDir |
Ordner, in dem Zertifikat (<domain>.crt) und Key (<domain>.key) abgelegt bzw. von dort eingelesen werden. |
skipCreation |
Wenn true, wird kein neues Zertifikat angefordert, sondern direkt das vorhandene aus outputDir eingelesen. |
do |
Muss true sein, damit überhaupt eine neue Anfrage bei Let's Encrypt gestellt werden darf (zusätzlich zur Prüfung, ob laut renewAfter eine Erneuerung fällig ist). |
renewAfter |
Anzahl Tage vor Ablauf, ab der das Zertifikat erneuert wird. |
dnsPropagationDelay |
Wartezeit in Millisekunden nach dem Setzen des TXT Records, bevor Let's Encrypt die Challenge prüft (Standard: 60000). |
middleware |
Array der DNS Middleware Module, die beim Setzen/Entfernen des TXT Records ausgeführt werden - siehe Middleware. |
certbot| Parameter | Beschreibung |
|---|---|
domain |
Die Domain, für die per certbot ein Zertifikat angefordert wird. |
email |
E-Mail Adresse, die certbot bei Rückfrage automatisch einträgt. |
test |
Wenn true, wird der Let's Encrypt Staging-Server statt der Produktivumgebung verwendet. |
skip_to_done |
Wenn true, wird certbot nicht ausgeführt, sondern direkt das vorhandene Zertifikat unter /etc/letsencrypt/live/<domain>/ eingelesen. |
sleep |
Wartezeit in Millisekunden nach dem Setzen des TXT Records, bevor certbot mit Enter fortgesetzt wird (DNS Propagation). |
middleware |
Array der DNS Middleware Module, die beim Setzen/Entfernen des TXT Records ausgeführt werden - siehe Middleware. |
Trägt den TXT Record beim DNS Provider ein, damit Let's Encrypt die Domain bestätigen kann. Gehört zum Input Modul und wird unter input.options.middleware als Array konfiguriert (Input → Options → Middleware), nicht als eigener Top-Level-Schlüssel.
| Modul | Beschreibung |
|---|---|
powerdns |
Trägt den TXT Record direkt in die MySQL Datenbank einer PowerDNS Instanz ein und erhöht den Serial der Zone. |
buddyns |
Synchronisiert die Zone bei BuddyNS über deren API. |
powerdns| Parameter | Beschreibung |
|---|---|
domain |
Die Domain, deren TXT Record gesetzt wird. |
domain_id |
ID der Zone in der PowerDNS Datenbank. |
authentification.host |
Host der MySQL Datenbank von PowerDNS. |
authentification.user |
Benutzername für die MySQL Datenbank. |
authentification.password |
Passwort für die MySQL Datenbank. |
authentification.database |
Name der PowerDNS Datenbank. |
buddyns| Parameter | Beschreibung |
|---|---|
domain |
Die Domain/Zone, die bei BuddyNS synchronisiert wird. |
authentification.username |
Benutzername des BuddyNS Accounts. |
authentification.password |
Passwort des BuddyNS Accounts. |
Verteilt das fertige Zertifikat. Liegt als Array unter output - du kannst beliebig viele Output Module hintereinander ausführen lassen.
| Modul | Beschreibung |
|---|---|
get_cert_from_plain |
Liest die Details aus dem erzeugten Zertifikat aus, z.B. zum Loggen/Debuggen. |
pfx_creator |
Erstellt aus Zertifikat und Key per OpenSSL eine PFX (PKCS#12) Datei. |
ssh_scp |
Überträgt Zertifikat, Key oder PFX per SCP auf einen oder mehrere Server und führt danach beliebige Shell-Befehle aus, z.B. um einen Dienst neu zu starten. |
opnsense |
Legt das Zertifikat über die OPNsense API an bzw. aktualisiert es und startet WebGUI/NGINX neu. |
get_cert_from_plainKeine - das Modul braucht keine Optionen.
pfx_creator| Parameter | Beschreibung |
|---|---|
path |
Zielpfad, unter dem die erzeugte PFX Datei abgelegt wird. |
password |
Passwort, mit dem die PFX Datei verschlüsselt wird. |
ssh_scp| Parameter | Beschreibung |
|---|---|
name |
Frei wählbarer Name des Ziels, dient nur der Anzeige in den Benachrichtigungen. |
server.host |
Hostname bzw. IP des Zielservers. |
server.username |
Benutzername für die SSH Verbindung. |
server.port |
SSH Port des Zielservers. |
server.privateKey |
Pfad zur privaten SSH-Key Datei, mit der sich am Server angemeldet wird. |
result_target |
Array aus { from_path, to_path }. from_path ist ein Punkt-Pfad auf das Ergebnis-Objekt des Input/Output Laufs (z.B. crt.path, key.path oder pfx.path), to_path ist der Zielpfad auf dem Server. |
post_command |
Array von Shell-Befehlen, die nach der Übertragung nacheinander per SSH auf dem Zielserver ausgeführt werden, z.B. um einen Dienst neu zu starten. |
opnsense| Parameter | Beschreibung |
|---|---|
host |
Basis-URL der OPNsense Instanz inkl. Port, z.B. https://opnsense.example.com:10555. |
api_key |
API Key für die OPNsense REST API. |
api_secret |
API Secret für die OPNsense REST API. |
description |
Eindeutige Bezeichnung, über die ein vorhandenes Zertifikat in OPNsense gefunden und aktualisiert wird (sonst wird ein neues angelegt). |
verify_ssl |
Wenn false, wird das TLS Zertifikat der OPNsense API nicht geprüft. |
cert_from_path |
Punkt-Pfad auf das Ergebnis-Objekt, aus dem der Zertifikatsinhalt für den Upload gelesen wird, z.B. crt.plain. |
Informiert dich über den Verlauf. Liegt als Array unter notification - du kannst mehrere Kanäle gleichzeitig nutzen.
| Modul | Beschreibung |
|---|---|
console |
Gibt Meldungen in der Konsole aus. |
email |
Sammelt alle Meldungen und verschickt sie am Ende des Laufs per Mail. |
Jedes Modul kennt die Log-Level debug, information, warning und error. Über level in der Konfiguration legst du fest, ab welcher Stufe eine Benachrichtigung etwas anzeigt bzw. verschickt.
console| Parameter | Beschreibung |
|---|---|
level |
Ab welchem Log-Level (debug, information, warning, error) eine Meldung in der Konsole ausgegeben wird. |
email| Parameter | Beschreibung |
|---|---|
host |
SMTP Host, über den die Mail verschickt wird. |
port |
SMTP Port. |
secure |
Wenn true, wird die Verbindung über TLS aufgebaut. |
auth.user |
Benutzername für die SMTP Authentifizierung. |
auth.pass |
Passwort für die SMTP Authentifizierung. |
from |
Absenderadresse der Mail. |
to |
Empfängeradresse der Mail. |
subject |
Betreff der Mail. |
level |
Ab welchem Log-Level (debug, information, warning, error) eine Meldung in die Mail aufgenommen wird. |
pfx_creator Output Modul benötigt)Die komplette Konfiguration liegt in einer JSON Datei und wird beim Start als Pfad übergeben:
node index.js ./config/config.json
Die Datei ist ein Array aus einzelnen Läufen. Jeder Lauf besteht aus einem trigger, einem input, beliebig vielen output und beliebig vielen notification Modulen:
[
{
"trigger": [
{ "module": "now" },
{ "module": "cron", "options": { "execution": "0 5 * * 7" } }
],
"input": {
"module": "acme_dns",
"options": {
"domain": "example.com",
"wildcard": true,
"email": "you@example.com",
"directoryUrl": "https://acme-v02.api.letsencrypt.org/directory",
"outputDir": "/app/config",
"renewAfter": 7,
"middleware": [
{ "module": "powerdns", "options": { "...": "..." } }
]
}
},
"output": [
{ "module": "pfx_creator", "options": { "...": "..." } },
{ "module": "ssh_scp", "options": { "...": "..." } }
],
"notification": [
{ "module": "email", "options": { "level": "information", "...": "..." } },
{ "module": "console", "options": { "level": "debug" } }
]
}
]
Du kannst beliebig viele Läufe im Array hinterlegen und pro Lauf beliebig viele Output- und Notification Module miteinander kombinieren.
Das Tool läuft auch als Docker Container:
docker build -t cert_tool .
docker run -v ./config:/app/config cert_tool
| Mountpoint | Beschreibung |
|---|---|
/app/config |
Enthält die Konfigurationsdatei, die SSH Keys sowie die abgelegten Zertifikate. |