Allgemein

Signieren von Windows Delphi Anwendungen

FireMonkey Apps für iOS und Android werden in Delphi im Rahmen des Bereitstellungsprozesses automatisch signiert – dies ist inbesondere für iOS Apps unabdingbar und wurde daher in der Delphi IDE auch entsprechend umgesetzt.

Bei Windows Anwendungen (egal ob 32 oder 64 Bit) ist dagegen keine Signatur-Option in Delphi zu finden. Dies dürfte dazu führen, dass viele Delphi Apps unsigniert verteilt werden. Dies ist jedoch spätestens seit Windows 10 nicht mehr zu empfehlen, denn der mit Windows 10 eingeführte „SmartScreen-Filter“ blockiert standardmäßig „nicht vertrauenswürdige“ Anwendungen. Eine unsignierte Anwendung (EXE) ist per se „nicht vertrauenswürdig“, da ihre Herkunft nicht verifiziert werden kann.

Hin und wieder findet man dann den wenig schlauen „Tip“, wie man diese SmartScreen Prüfung abschalten kann. Einzig richtige Vorgehensweise ist es dagegen, als Entwickler nur signierte Anwendungen heraus zu geben (egal ob öffentlich oder inhouse)! Als Anwender sollte man Lieferanten auf die Füße treten, die weiterhin unsignierte Anwendungen verkaufen.

Signatur-Zertifikate

Um eine EXE zu signieren, ist zunächst ist ein valides Zertifikat erforderlich, welches das sog. Code Sigining unterstützt. Solche Zertifikate werden von Anbietern wie Comodo, Thawte, Symantec und anderen herausgegeben. Die Anbieter führen dabei je nach gewählter Preisklasse eine mehr oder minder intensive Indentitätsprüfung des Beantragenden durch – schließlich soll das Zertifikat ja eindeutig die Firma oder Person, die eine Anwendung liefert, identifizieren können. Die Kosten liegen dabei jährlich im unteren bis mittleren dreistelligen Bereich.

Brauchbare kostenlose Zertifikate konnte ich nicht finden (so scheut z.B. LetsEncrypt den Aufwand, den eine Identitätsprüfung mit sich bringt), die günstigste Variante ist ein Comodo-Zertifikat per CodeSignCert zu bestellen. Dort ist man mit $75 für ein Jahr dabei.

Signieren in Delphi

Zunächst ist das entsprechende Windows 10 SDK zu installieren, welches die sog. „signtool.exe“ von Microsoft enthält. Die 32-Bit Version wird sich danach typischerweise in einem Pfad ähnlich diesem finden : C:\Program Files\Windows Kits\10\bin\x86\signtool.exe

Nun ist zu überlegen, wie mit dem Zertifikat umgegangen werden soll. Es gibt zwei Möglichkeiten:

  1. Installation im Windows-Zertifikatspeicher und damit Nutzung des Windows-eigenen Schutzmechanismusses.
  2. Speichern des Zertifikats als PFX-Datei und Hinterlegen des Passworts im Build-Prozess der Anwendung.

Letztlich muss bedacht werden, dass dieses Zertifikat wie ein Personalausweis zu verstehen ist. Man sollte es also nicht einfach „irgendwo rumliegen“ lassen, da sonnst jedermann diese Identität für seine eigenen Zwecke nutzen könnte. Besonder das Einchecken in ein Sourcecontrol-System scheint hier wenig sinnvoll.

Ich nutze in der Regel den Windows-Zertifikatspeicher, dort habe ich dann eine zentrale Übersicht meiner Zertifikate und kann so auch schnell sehen, wann ein Zertifikat abläuft.

Grundsätzlich kann man nun eine kompilierte Delphi-Anwendung von Hand signieren, indem man folgenden Befehl auf der Kommandozeile eingibt:

"C:\Program Files\Windows Kits\10\bin\x86\signtool.exe" sign /n "developer experts" /tr http://timestamp.comodoca.com /du https://www.developer-experts.net C:\Projekte\SignTest\Win32\Release\SignTest.exe

Die SignTest.exe wird dadurch mit einem Zertifikat signiert, welches im „Subject“ (dem Namen) „Developer Experts“ enhält. Wenn sich nur ein einziges Code Signing Zertifikat im Windows Zertifikatspeicher befindet, dann kann man die Option /n auch weg lassen – es schadet aber auch nicht.

Die weiteren Optionen:
/tr – hier wird ein sog. Timestam-Server angegeben. Verschiedene Zertifikatslieferanten (die sog. CAs) betreiben diese, ich nutze hier den Server von Comodo – es muss jedoch nicht zwingend der Server des eigenen Zertifikatslieferanten sein. Durch diese Option wird (kurz formuliert) dem Timestamp-Server ein Hash meiner Exe übermittelt, der Server stellt dann eine Signatur zu diesem Hash aus, die mit einem, auf dem Server generierten, Zeitstempel versehen wird. Dies wird dann der eigentlichen Signatur hinzugefügt. Das Verfahren soll verhindern, dass der Lieferant einer EXE nicht „schummeln“ kann, also nicht vor- oder rückdatieren kann.
Achtung: Verschiedene ältere Blogeinträge zu diesem Thema nutzen meinst nur die Option /t – dies führt jedoch – ohne weitere Angabe eines Algorithmus – zur Nutzung des veralteten SHA1 Verfahrens. Die Option /tr dagegen arbeitet nach RFC 3161 und handelt mit dem Server mindestens SHA256 aus.

/du – fügt die angegebene URL als „erweiterte Beschreibung“ der Signatur hinzu. Dies ist insbesondere für eine Hersteller-URL geeignet

Um diesen Signiervorgang nicht jedes mal manuell ausführen zu müssen, kann man das in die Post-Build-Option des jeweiligen Delphi Projekts einbinden. Ich nutze hierfür die Release-Konfiguration, weil nur diese zum Kunden geht.

Zu beachten ist, dass man hier praktischerweise „($OUTPUTPATH)“ als Signaturziel angibt, damit der Pfad nicht hartkodiert ist – und man das ganze per Copy and Paste in andere Projekte einfügen kann 😉

Ausserdem ist das Pre-Build-Ereignis „del ($OUTPUTPATH)“ wichtig, weil sonst mitunter das Signieren fehlschlägt.

Mit jedem Kompilieren“ wird nun in der Release-Konfiguration die EXE signiert – die Debug-Konfiguration bleibt unverändert. Gerade bei sehr großen Projekten kann eine Debug-Exe schon mal schnell mehrere hundert MB groß werden, was beim Signieren dann auch ein wenig Zeit benötigt.

Coderage XII : Single Sign-on with Facebook

Single Sign-on with Facebook’s Login API and Delphi – my session at Coderage XII. Please see below for the link to the materials.

Download Sourcecode …

Supplying a username and a password has been standard for many years to grant access to protected applications. This works reasonably well, yet there are issues that you may want to address with your applications:

  • shared passwords between apps, because it is easier to remember only a few passwords, than one password per application
  • too easy to guess, non-strong passwords
  • keeping your users passwords in a safe location
  • missing protection for sensitive account actionsFacebook offers an API, that allows any application (desktop and mobile) to authenticate against Facebook account information, which basically implements single sign-on on a broad scope. A Facebook user only needs to create and keep track of his Facebook credentials. This password can be selected in a complex way as it is the only one that users need to remember, which makes it harder to guess. Facebooks also provides infrastructure and staff that actively protects their user database against any sorts of cyber attacks.

    In this session I demonstrate how to implement Facebook’s Login APIs in your Delphi application.

Firemonkey TMemo Scrolling

When you add lines to a TMemo in Delphi Applications, then you might want to scroll to the very end of that particular Memo, so that the newest lines are kept in view.

In FireMonkey it’s as easy as just calling GoToTextEnd:

procedure TFormMain.AddLog(AMessage: string);
begin
  Memo1.Lines.Add(AMessage);
  Memo1.GoToTextEnd;
end;

You might notice though, that when you clear the Memo at certain times, the scrollbars may get out of sync. To avoid that, you need to call ProcessMessages right after „clear“. Apparently the scrollbars get confused, when you add lines directly after clear command, because the actual position needs to be rendered first (which the ProcessMessages does).

procedure TFormMain.AddLog(AMessage: string);
begin
  if Memo1.Lines.Count > 100 then 
    begin
      Memo1.Lines.Clear;
      Application.ProcessMessages; //without this, scrollbars will show wrong size/position
    end;
  Memo1.Lines.Add(AMessage);
  Memo1.GoToTextEnd;
end;

MVVM Anwendungen mit Delphi und nicht gegen Delphi

Im folgenden Video meines Youtube-Kanals eine Einführung zum Thema MVVM Anwendungen mit Delphi. Wichtige Motivation ist für mich, dass ich soviel Delphi wie möglich verwende, also eben nicht anfange, alles von Hand im Source-Editor hinzuschreiben.

Hinweis: Das Video versteht sich als erste Einführung in das Thema MVVM mit Delphi. Selbstverständlich gibt es noch eine ganze Reihe von Dingen, die man optimieren und ausbauen kann. Weitere Schritte werde ich hier in noch folgenden Beiträgen skizzieren.

Das Video ist in Deutsch.

Wir benutzen Cookies um die Nutzerfreundlichkeit der Webseite zu verbessen. Durch Deinen Besuch stimmst Du dem zu.