Headerbild

Heute stand ich vor dem Problem, dass ich ein One-Click-Deploy im Visual Studio 2005 signieren musste, das temporäre Zertifikat vom Visual Studio aber nur für ein Jahr gültig ist. Da mir dieser Zeitraum nicht reichte (Es gibt immer wenn das Zertifikat abläuft Probleme damit) musste eine Lösung her dieses Zertifikat für eine längere Zeit zu generieren. Nach einiger Suche nach Windows-Methoden dafür habe ich es dann aufgegeben und mich der Generierung auf einem Linux-System zugewandt.

Hier ist der Weg um sich ein solches Zertifikat zu generieren, mit dem man seine Deploys und Assemblys signieren kann:

Die Schritte sollten in einem eigenen Ordner durchgeführt werden, damit keine Verwechslungen mit anderen Dateien auftreten können.

Achtung: Die fettgedruckten Befehlszeilen müssen immer in einer Zeile liegen!

Als erstes generieren wir einen privaten Schlüssel für unser Zertifikat. Dazu verwenden wir OpenSSL und einen RSA-Schlüssel ohne Passwort:

$ openssl genrsa -out privkey.pem 2048
Generating RSA private key, 2048 bit long modulus
……+++
………+++
e is 65537 (0×10001)

Zu diesem Schlüssel wird dann ein Self-Signed-Zertifikat generiert. (An dieser Stelle kann natürlich auch ein CSR für z.B. CaCert erstellt werden)

$ openssl req -new -x509 -key privkey.pem -out cacert.pem -days 4000
[...]
Country Name (2 letter code) [AU]:DE
State or Province Name (full name) [Some-State]:Niedersachsen
Locality Name (eg, city) []:Weyhe
Organization Name (eg, company) [Internet Widgits Pty Ltd]:K. Ahlers
Organizational Unit Name (eg, section) []:Software Development
Common Name (eg, YOUR name) []:K. Ahlers
Email Address []:knut@ahlers.me

In diesem Fall wurde ein Zertifikat für 4000 Tage generiert. Die Daten unten sollten natürlich angepasst werden.

Im letzten Schritt wird dann aus den Schlüsseldateien ein PKCS#12-Zertifikat erstellt, welches vom Visual Studio verarbeitet werden kann:

$ openssl pkcs12 -export -in cacert.pem -inkey privkey.pem -out cert.pfx -name “MyAPP”
Enter Export Password:
Verifying – Enter Export Password:

Achtung: An dieser Stelle muss ein Passwort eingegeben werden. Windows akzeptiert es nicht, wenn eine PKCS#12-Datei nicht passwortgeschützt ist.

Diese Datei wird dann in das Projekt kopiert und im Signierungs-Dialog ausgewählt. Schon ist die Anwendung mit einem Zertifikat signiert, welches nahezu eine Ewigkeit gültig ist ;)

Heute war mal Zeit genug um mich mal wieder den Updates auf dem Rechner meiner Mutter an zu nehmen und da sowieso gerade ein ServicePack (Nummer 3) für Windows XP aktuell ist wurde dieses zur “Mach ich mal eben nebenbei mit”-Aufgabe erkoren.

Die Installation des ServicePacks: Kein Problem. Der Neustart ebenfalls nicht.

Nach dem Neustart allerdings folgte ein Neustart und ein Neustart usw… Somit lag doch sehr schnell die Vermutung nahe, dass es Bluescreen-Of-Death sein unwesen treibt. Dank der Funktionalität diese automatischen Neustarts zu deaktivieren war der Grund relativ schnell ersichtlich:

STOP: c0000139 {Entry Point Not Found}

The procedure entry point GdiGetBitmapBitSize could not be located in the dynamic link library GDI32.dll.

Grandios… Die Microsoftler haben eine Funktion in ihrer GDI-Lib vergessen.

Dank dem Internet war die Lösungsstrategie relativ schnell klar:

  1. Make a backup of existing GDI32.dll in system folder.
  2. Then copy backup GDI32.dll from c:\windows\servicepackfiles\i386\gdi32.dll to the system folder.
  3. Restart computer.

Da die Windows-CD sich grandioser Weise ganz hinten im Regal versteckt hatte musste also eine Knoppix-CD her und in Kürze waren die Dateien ausgetauscht und das System funktionierte wieder.

Aber mal ganz ehrlich: Warum? Wie kann man so eine Sch***** auf den Markt werfen? Ein Service-Pack was erstmal eine riesige Macke ins System schlägt kann es doch echt nicht sein oder? Vor allem war das kein Download von irgend einer Drittanbieter-Seite sondern ein normaler Download direkt von MS.

Schon ziemlich BITTER!

knuttr2@knut.me