Windows mit libcrypto

Wenn man vergisst die SSL/TSL Bibliotheken ins Zielverzeichnis zu kopieren, sollte das Laden eines davon abhängigen Programms fehlschlagen.
Doch so “zur Hälfte” konnte doch was geladen werden … und das war für mich ein intessantes Rätsel.

Wie sich herausgestellt hat liefert Microsoft sein Windows seit 2018 offenbar mit einer libcrypto Variante aus.


Wer SSL/TLS Features benötigt, ist grundsätzlich von Fremdbibliotheken abhängig. Unter Linux war das schon immer so und Windows … naja dort eigentlich auch. Die alte (wincrypt) und neue (bcrypt) Implementierung in der WinAPI ist immer auf dem Stand, als die Windows Version auf den Markt kam … also immer veraltet.

Zum Glück stehen mit OpenSSL und libreSSL zwei hervorragende Kandidaten parat, die die Lücke problemlos füllen … wenn man sie eingebunden bekommt.

Linkt man die beiden Teilbibliotheken libcrypto und libssl dynamisch, darf man sich beim Deployment ärgern, wenn sie nicht vorhanden sind oder in der falschen Version vorliegen.
Link man sie statisch, hat man garantiert das Richtige dabei, bekommt aber eine 2 MB+ große EXE, die sonst nur 200 KB groß gewesen wäre.

Ich habe daher wie so oft eine duale Strategie für SSL vorgesehen und kann entweder mit der statischen Variante arbeiten, oder lade zur Laufzeit die notwendigen Funktionspointer per Hand nach, womit ich ebenso nicht gegen SSL-Libs linken muss und beim Start einfach die “nächst-greifbare” Variante geladen wird.

Windows 10 and Server 2019 mit libcrypto

Microsoft hat interessanterweise im Jahr 2018 erstmals eine ältere Version der libcrypto.dll aus dem libreSSL Projekt ins Windows\\System32 Verzeichnis gelegt, jedoch nicht den SSL/TLS Teil.
Im Server 2016 und älteren Windows-10 IOT Versionen von 2016 ist die DLL noch nicht vorhanden.

Genau das führte bei mir zu einigen Problemchen beim “dynamischen” Nachladen der Funktionalität. Denn statt wie erwartet nichts zu finden, wenn keine DLLs von mir ausgeliefert werden, wurde plötzlich libcrypto geladen und die nachfolgenden libssl schlug fehl.

Auf diesen Halbstand war ich nicht vorbereitet und somit musste ich die Fehlerbehandlung anpassen.
… doch aus dieser interessanten Erkenntnis leitet sich ein anderer Vorteil ab.

libssh2 mit Boardmitteln betreiben

libssh2 nutzt für den Aufbau von SSH Sitzungen ausschließlich Funktionen der libcrypto aber braucht keinen SSL/TLS Support. Bisher musste ich immer eine vollständige libreSSL oder OpenSSL Schnittstelle bereitstellen, wenn ich SSH einsetzen wollte … doch mit einem aktuellen Windows kann man diese Funktionalität auch vom OS Kern beziehen.

Da Import-Bibliotheken für die libcrypto fehlen, habe ich einfach statische Wrapper um die notwendigen APIs erstellt und nun kann libssh2 gegen meinen statischen Wrapper linken, der im Hintergrund dann nur die libcrypto lädt und die Funktionspointer importiert.

So entsteht dann eine schlanke SSH Implementierung, die vom OS mitverwaltet wird und fette Crypto/SSL Kopien entfallen.

Fazit

Windows wird langsam OpenSource-tauglich.

Ich kann wieder mal nicht nachvollziehen, warum diese freie Bibliothek erst so spät in Windows Einzug gehalten hat und verstehe schon gar nicht, warum der SSL/TLS Teil wieder fehlt.

Im allgemeinen Fall ist es weiter sicher besser die ganze Crypto/SSL Implementierung selbst bereitzustellen … aber für neu entwickelte Tools ist das Vorhandensein von OpenSource-Kryptographie zumindest mal ein guter Start.

📧 📋 🐘 | 🔔
 

Meine Dokus über:
 
Weitere externe Links zu:
Alle extern verlinkten Webseiten stehen nicht in Zusammenhang mit opengate.at.
Für deren Inhalt wird keine Haftung übernommen.



Wenn sich eine triviale Erkenntnis mit Dummheit in der Interpretation paart, dann gibt es in der Regel Kollateralschäden in der Anwendung.
frei zitiert nach A. Van der Bellen
... also dann paaren wir mal eine komplexe Erkenntnis mit Klugheit in der Interpretation!