Discussion:
PKCS12 Datei auslesen ohne externe Programme?
(zu alt für eine Antwort)
Stefan M. Huber
2018-07-19 06:36:11 UTC
Permalink
Grüß euch!

Hat jemand von euch einen Hinweis für mich, wie man die Inhalte von
PKCS12 Dateien auslesen kann? Gibt's da für Delphi irgendwelche
brauchbaren Wege?

Ich finde nicht einmal in der Windows API Dokumentation etwas zu dem
Thema. Daher nehme ich an, dass ich einfach nur falsch suche.

Danke
Stefan
Ole Jansen
2018-07-19 07:00:11 UTC
Permalink
Post by Stefan M. Huber
Grüß euch!
Hat jemand von euch einen Hinweis für mich, wie man die Inhalte von
PKCS12 Dateien auslesen kann? Gibt's da für Delphi irgendwelche
brauchbaren Wege?
Evtl. hilft dieser Link weiter:
<https://www.disi.unige.it/person/FerranteM/delphiopenssl/>
(Wobei ich nur PKCS#7 ausprobiert habe)

Viele Grüße,

O.J.
Stefan M. Huber
2018-07-19 07:42:38 UTC
Permalink
Post by Ole Jansen
Post by Stefan M. Huber
Grüß euch!
Hat jemand von euch einen Hinweis für mich, wie man die Inhalte von
PKCS12 Dateien auslesen kann? Gibt's da für Delphi irgendwelche
brauchbaren Wege?
<https://www.disi.unige.it/person/FerranteM/delphiopenssl/>
(Wobei ich nur PKCS#7 ausprobiert habe)
Danke, ich glaub darüber bin ich auch schon gestolpert, hab's aber
verworfen, weil es eine Abhängigkeit zu einer DLL beinhaltet. Und PKCS
#7 und #12 sind ja doch anders.

Ich hab auch ein Projekt gefunden, wo leider in der TODO-Liste drinnen
stand: "PKCS #21" :)

Ich versuche mich gerade an PFXImportCertStore, das aber leider in der
wcrypt2 Bibliothek nicht verfügbar ist.

Sollte ich was zustande bringen, poste ich es hier.

Stefan
Ole Jansen
2018-07-19 10:40:41 UTC
Permalink
Post by Stefan M. Huber
Ich hab auch ein Projekt gefunden, wo leider in der TODO-Liste drinnen
stand: "PKCS #21" :)
Ich versuche mich gerade an PFXImportCertStore, das aber leider in der
wcrypt2 Bibliothek nicht verfügbar ist.
Sollte ich was zustande bringen, poste ich es hier.
SSL ist ein moving Target.
<https://www.openssl.org/news/vulnerabilities.html>

Auch wenn ich sonst ein Anhänger von eigenen Implementierungen
bin und mich Bloat und Abhängigkeiten nerven nutze ich für SSL/TLS
Indy. Um meine Wunschfunktionen z.B. aus dem OpenSSL Code raus
zu fummeln fehlt mir Zeit und Antrieb. Schließlich müsste ich es
auch ggf. warten falls später "Updates" kommen...

Binaries über z.B. ShellExecute zu verwenden um Deine Container
aus/einzupacken scheiden aus bei Dir?

O.J.
Stefan M. Huber
2018-07-19 16:20:53 UTC
Permalink
Post by Ole Jansen
Post by Stefan M. Huber
Ich hab auch ein Projekt gefunden, wo leider in der TODO-Liste drinnen
stand: "PKCS #21" :)
Ich versuche mich gerade an PFXImportCertStore, das aber leider in der
wcrypt2 Bibliothek nicht verfügbar ist.
Sollte ich was zustande bringen, poste ich es hier.
SSL ist ein moving Target.
<https://www.openssl.org/news/vulnerabilities.html>
Auch wenn ich sonst ein Anhänger von eigenen Implementierungen
bin und mich Bloat und Abhängigkeiten nerven nutze ich für SSL/TLS
Indy. Um meine Wunschfunktionen z.B. aus dem OpenSSL Code raus
zu fummeln fehlt mir Zeit und Antrieb. Schließlich müsste ich es
auch ggf. warten falls später "Updates" kommen...
Naja, wir verwenden die Windows API und die wcrypt2, die darum gebaut
wurde - allerdings leider eben nicht vollständig.

Ich hab's auf die Schnelle nicht gefunden: Kann Indy mit PKCS#12
Containern umgehen? Anders gefragt: Ist http://www.indyproject.org
wirklich die Homepage von Indy?
Post by Ole Jansen
Binaries über z.B. ShellExecute zu verwenden um Deine Container
aus/einzupacken scheiden aus bei Dir?
Ja.

Stefan
Ole Jansen
2018-07-20 07:12:26 UTC
Permalink
Post by Stefan M. Huber
Post by Ole Jansen
Auch wenn ich sonst ein Anhänger von eigenen Implementierungen
bin und mich Bloat und Abhängigkeiten nerven nutze ich für SSL/TLS
Indy. Um meine Wunschfunktionen z.B. aus dem OpenSSL Code raus
zu fummeln fehlt mir Zeit und Antrieb. Schließlich müsste ich es
auch ggf. warten falls später "Updates" kommen...
Naja, wir verwenden die Windows API und die wcrypt2, die darum gebaut
wurde - allerdings leider eben nicht vollständig.
Ich hab's auf die Schnelle nicht gefunden: Kann Indy mit PKCS#12
Containern umgehen?
AFAIK kann es sie benutzen solange sie als Datei
vorliegen mit IndySSL_CTX_use_PrivateKey_file usw.

Wie gesagt, keine eigenen Erfahrungen, Google zeigt viele
Fragen und wenig Antworten...
Post by Stefan M. Huber
Anders gefragt: Ist http://www.indyproject.org
wirklich die Homepage von Indy?
Ja.

O.J.
Stefan M. Huber
2018-07-23 21:17:16 UTC
Permalink
Post by Ole Jansen
Post by Stefan M. Huber
Post by Ole Jansen
Auch wenn ich sonst ein Anhänger von eigenen Implementierungen
bin und mich Bloat und Abhängigkeiten nerven nutze ich für SSL/TLS
Indy. Um meine Wunschfunktionen z.B. aus dem OpenSSL Code raus
zu fummeln fehlt mir Zeit und Antrieb. Schließlich müsste ich es
auch ggf. warten falls später "Updates" kommen...
Naja, wir verwenden die Windows API und die wcrypt2, die darum gebaut
wurde - allerdings leider eben nicht vollständig.
Boah, ich bin wohl zu doof. Indy ist ja seint geraumer Zeit bei Delphi
schon dabei. Ich hab auch die Sources und finde zB die
IdSSLOpenSSLHeaders und die IdSSLOpenSSLUtils, die so eine
Implementierung in Ansätzen herzeigen. Nur jammert mein Delphi bei der
IdSSLOpenSSLUtils, dass es sie nicht fände, die IdSSLOpenSSLHeaders aber
schon. Liegen im selben Verzeichnis. Nur die DCU ist nicht mitgeliefert.

Ich werd noch wahnsinnig mit dem ganzen.

Die IdSSLOpenSSLUtils brauch ich voraissichtlich eh nur, um die DLL zu
laden, aber da scheitere ich schon. Welche DLL ist es denn eigentlich
wirklich, die da geladen wird? Ich bin auf der Suche nach einer openssl.dll.
Post by Ole Jansen
Post by Stefan M. Huber
Ich hab's auf die Schnelle nicht gefunden: Kann Indy mit PKCS#12
Containern umgehen?
AFAIK kann es sie benutzen solange sie als Datei
vorliegen mit IndySSL_CTX_use_PrivateKey_file usw.
Wie gesagt, keine eigenen Erfahrungen, Google zeigt viele
Fragen und wenig Antworten...
Post by Stefan M. Huber
Anders gefragt: Ist http://www.indyproject.org wirklich die Homepage
von Indy?
Ja.
O.J.
Ole Jansen
2018-07-24 08:09:34 UTC
Permalink
Post by Stefan M. Huber
Indy ist ja seint geraumer Zeit bei Delphi
schon dabei.
Gepflegte Kompilate der SSL DLLs für Indy bekommst Du hier:
<https://indy.fulgan.com/SSL/>
Post by Stefan M. Huber
Ich hab auch die Sources und finde zB die
IdSSLOpenSSLHeaders und die IdSSLOpenSSLUtils, die so eine
Implementierung in Ansätzen herzeigen.
Da kannst Du ja von abschreiben. Falls Du irgendwo eine lesbare
Dokumentation der zeitgenössischen libeay32.dll API
findest sag bitte Bescheid...
Post by Stefan M. Huber
Nur jammert mein Delphi bei der
IdSSLOpenSSLUtils, dass es sie nicht fände, die IdSSLOpenSSLHeaders aber
schon.
Den Fehler kenne ich noch nicht.
Es gibt eben eine ganze Menge Delphi, Indy und SSL Versionen...
Da musst Du Dich durchbeißen und die Kombination herausfinden
die für Dich funktioniert. Eine einfache Lösung gibt es vmtl. nicht.

Die Precompiled Binaries von der Fulgan Seite benötigen
jedenfalls Indy 10.5.5+ (SVN Version oder Delphi 2009 und neuer).
Post by Stefan M. Huber
Liegen im selben Verzeichnis. Nur die DCU ist nicht mitgeliefert.
Die sollst Du ja auch selber kompilieren. Sonst ist es ja nicht
sicher ;-)

Falls Du Dich low level mit dem Thema auseinandersetzen
möchtest: Hier ist eine ältere Import Unit für libeay von 2010:
<https://www.disi.unige.it/person/FerranteM/delphiopenssl/libeay32.pas>
und das Ding mit den P7 Containern wo ich von abgeschrieben habe:
<https://www.disi.unige.it/person/FerranteM/delphiopenssl/OpenSSLUtils.pas>

Evtl. kannst Du analog dazu einen p12 reader ableiten?
<https://stackoverflow.com/questions/6371775/how-to-load-a-pkcs12-file-in-openssl-programmatically>

Viel Erfolg!

O.J.
Stefan M. Huber
2018-07-24 13:24:16 UTC
Permalink
Post by Ole Jansen
Indy ist ja seint geraumer Zeit bei Delphi schon dabei.
<https://indy.fulgan.com/SSL/>
Ich hab auch die Sources und finde zB die IdSSLOpenSSLHeaders und die
IdSSLOpenSSLUtils, die so eine Implementierung in Ansätzen herzeigen.
Da kannst Du ja von abschreiben. Falls Du irgendwo eine lesbare
Dokumentation der zeitgenössischen libeay32.dll API
findest sag bitte Bescheid...
Nein, leider nicht. Hört alles mit openssl 0.7 oder so auf.
Post by Ole Jansen
Nur jammert mein Delphi bei der IdSSLOpenSSLUtils, dass es sie nicht
fände, die IdSSLOpenSSLHeaders aber schon.
Den Fehler kenne ich noch nicht.
[...]
Post by Ole Jansen
Liegen im selben Verzeichnis. Nur die DCU ist nicht mitgeliefert.
Die sollst Du ja auch selber kompilieren. Sonst ist es ja nicht
sicher ;-)
Wu willst mir sagen, dass OpenSSL wirklich erst dann funktioniert, wenn
man aus dem mitinstallierten Indy zum Delphi Tokyo die
IdSSLOpenSSLUtils.pas rauskopiert in einen lokalen Pfad des Projektes
und diese DCU erst selber generiert? Oder war der Emotionsanzieger eher
Richtung Sarkasmus gedacht?

Ich versuchs jetzt mit einer frisch ausgecheckten SVN-Version von
Indy10, die ich komplett ins Projekt verlege und der vorkompilierten DLL
von fulgan.com
Post by Ole Jansen
Falls Du Dich low level mit dem Thema auseinandersetzen
<https://www.disi.unige.it/person/FerranteM/delphiopenssl/libeay32.pas>
<https://www.disi.unige.it/person/FerranteM/delphiopenssl/OpenSSLUtils.pas>
Evtl. kannst Du analog dazu einen p12 reader ableiten?
<https://stackoverflow.com/questions/6371775/how-to-load-a-pkcs12-file-in-openssl-programmatically>
Das wäre der Plan gewesen - eigentlich aber in Richtung Windows API mit
PFXCertImportStore, mit dem man ein PKCS-File eigentlich in einen
volatilen (oder permantenten) Store laden können sollte. Krieg ich nur
leider nicht hin.

Vielen Dank bisher!
Stefan
Stefan M. Huber
2018-07-24 13:30:55 UTC
Permalink
Post by Ole Jansen
Nur jammert mein Delphi bei der IdSSLOpenSSLUtils, dass es sie nicht
fände, die IdSSLOpenSSLHeaders aber schon.
[..]
Post by Ole Jansen
Liegen im selben Verzeichnis. Nur die DCU ist nicht mitgeliefert.
Die sollst Du ja auch selber kompilieren. Sonst ist es ja nicht
sicher ;-)
Lese ich das richtig, dass ich eigentlich mit den vorinstallierten
Indy-Komponenten nicht arbeiten kann und es grausam wird, wenn
irgendwelche Komponenten des vorinstallierten Indy verwendet wurden und
wir jetzt für OpenSSL eine neue Version einkompilieren müssen?

Irgendwie verursacht mir das Bauchschmerzen.

Stefan
Ole Jansen
2018-07-25 05:52:43 UTC
Permalink
Post by Stefan M. Huber
Post by Ole Jansen
Nur jammert mein Delphi bei der IdSSLOpenSSLUtils, dass es sie nicht
fände, die IdSSLOpenSSLHeaders aber schon.
[..]
Post by Ole Jansen
Liegen im selben Verzeichnis. Nur die DCU ist nicht mitgeliefert.
Die sollst Du ja auch selber kompilieren. Sonst ist es ja nicht
sicher ;-)
Lese ich das richtig, dass ich eigentlich mit den vorinstallierten
Indy-Komponenten nicht arbeiten kann
Die Demos gehen idR. Der Rest wurde vmtl. nicht getestet?
Post by Stefan M. Huber
und es grausam wird, wenn
irgendwelche Komponenten des vorinstallierten Indy verwendet wurden und
wir jetzt für OpenSSL eine neue Version einkompilieren müssen?
Software gegen OpenSSL zu linken ist ein wenig wie einen Pudding
an einen Baum zu nagel. Du solltest unbedingt die Indy/OpenSSL
aufeinander abgestimmt wählen und alles gut weg legen.

Hinzu kommt dass Indy AFAIK nur TLS1.0 kann und für höhere
Versionen komplett überarbeitet werden muss (Asynchrone Sockets,
Threads usw...)
Post by Stefan M. Huber
Irgendwie verursacht mir das Bauchschmerzen.
OpenSSL eben ;-)

Die Kernentwickler helfen mit bei der Portierung und Indy 10
soll ja einigermaßen auf FPC/Lazarus gehen, incl. diverser
Plattformen.
Da wird man wohl bei OpenSSL bleiben müssen. Ob es parallel
dazu eine Delphi/Windows-Schiene geben wird die SChannel
benutzt?

O.J.
Stefan M. Huber
2018-07-26 06:25:16 UTC
Permalink
Post by Ole Jansen
Falls Du Dich low level mit dem Thema auseinandersetzen
<https://www.disi.unige.it/person/FerranteM/delphiopenssl/libeay32.pas>
<https://www.disi.unige.it/person/FerranteM/delphiopenssl/OpenSSLUtils.pas>
Evtl. kannst Du analog dazu einen p12 reader ableiten?
<https://stackoverflow.com/questions/6371775/how-to-load-a-pkcs12-file-in-openssl-programmatically>
So, ich hab's jetzt endlich ohne externe Programme und DLLs geschafft.
Ich bin vor allem daran gescheitert, dass ich beim "Übersetzen" der
Windows API-Funktion PFXImportCertStore das stdcall; vergessen habe. Und
dann noch den CRYPT_DATA_BLOB falsch befüllt.

Der jetzt funktionierende Code schaut eigentlich recht einfach aus
(GetDataBlob ruft CryptBinaryToStringA auf, das in wcrypt2.pas drinnen
ist, das laut Disclaimer auf http://delphi-jedi.org/ gefunden werden kann)

function PFXImportCertStore(pPFX : PCRYPT_DATA_BLOB;
szPassword : LPCWSTR;
dwFlags : DWORD): HCERTSTORE; stdcall;
function CryptBinaryToStringA(pbBinary: pointer; cbBinary: dword;
dwFlags: dword;
pszString: PAnsiChar; var pcchString: dword): boolean; stdcall;




{$IFDEF UNICODE}
function CryptBinaryToString; external crypt32 name 'CryptBinaryToStringW';
{$ELSE}
function CryptBinaryToString; external crypt32 name 'CryptBinaryToStringA';
{$ENDIF}
function CryptBinaryToStringA; external crypt32 name 'CryptBinaryToStringA';
function CryptBinaryToStringW; external crypt32 name 'CryptBinaryToStringW';



function PFXImportCertStore; external 'crypt32.dll' name
'PFXImportCertStore';




function GetDataBlobText(AData: DATA_BLOB; Art: DWORD): AnsiString;
var size: Cardinal;
begin
CryptBinaryToStringA(AData.pbData, AData.cbData, Art, nil, size);
SetLength(Result, size-1);
CryptBinaryToStringA(AData.pbData, AData.cbData, Art,
PAnsiChar(Result), size);
end;



function PKCS12Seriennummer(ADateiname, APassphrase: String): String;
var store: HCERTSTORE;
ms: TMemoryStream;
cryptBlob: CRYPT_DATA_BLOB;
context: PCCERT_CONTEXT;
ci: PCERT_INFO;
SerialNo: String;
i: Integer;
gle: DWORD;
begin
Result := '';
if not FileExists(ADateiname) then EXIT;
ms := TMemoryStream.Create;
try
ms.LoadFromFile(ADateiname);
cryptBlob.cbData := ms.Size;
cryptBlob.pbData := ms.Memory;
store := PFXImportCertStore(@cryptblob, PChar(APassphrase),
CRYPT_USER_KEYSET or PKCS12_NO_PERSIST_KEY);
try
if store=nil then
begin
gle := GetLastError;
ShowMyMessage(IntToHex(gle, 8), mtError);
EXIT;
end;
context := CertEnumCertificatesInStore(store, nil);
while context<>nil do
begin
ci := context.pCertInfo;
SerialNo := GetDataBlobText(ci.SerialNumber, CRYPT_STRING_HEX);
for i := Length(SerialNo) downto 1 do // Byteorder passt auch
nicht zusammen.
if not (SerialNo[i] in ['0'..'9','A'..'F']) then
Delete(SerialNo, i,1);

ShowMyMessage(GetDataBlobText(ci.Issuer,CRYPT_STRING_HEXASCII)+#13#10+serialno{+#13#10+GetDataBlobText(context,
CRYPT_STRING_BASE64)});
context := CertEnumCertificatesInStore(store, context);
end;
finally
CertCloseStore(store,0);
end;
finally
ms.Free;
end;
end;
Ole Jansen
2018-07-26 06:53:19 UTC
Permalink
Post by Stefan M. Huber
Der jetzt funktionierende Code schaut eigentlich recht einfach aus
(GetDataBlob ruft CryptBinaryToStringA auf, das in wcrypt2.pas drinnen
ist, das laut Disclaimer auf http://delphi-jedi.org/ gefunden werden kann)
Super, herzlichen Glückwunsch!

O.J.
Stefan M. Huber
2018-07-26 10:33:28 UTC
Permalink
Post by Ole Jansen
Post by Stefan M. Huber
Der jetzt funktionierende Code schaut eigentlich recht einfach aus
(GetDataBlob ruft CryptBinaryToStringA auf, das in wcrypt2.pas drinnen
ist, das laut Disclaimer auf http://delphi-jedi.org/ gefunden werden kann)
Super, herzlichen Glückwunsch!
Danke dir.
Und danke für deinen Beistand.

Ich hoffe, jemand kann was damit anfangen.

Stefan

Loading...