AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Public Key aus einem X509 Zertifikat auslesen
Thema durchsuchen
Ansicht
Themen-Optionen

Public Key aus einem X509 Zertifikat auslesen

Ein Thema von Sherlock · begonnen am 21. Okt 2014 · letzter Beitrag vom 23. Okt 2014
Antwort Antwort
Benutzerbild von Sherlock
Sherlock
Online

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#1

Public Key aus einem X509 Zertifikat auslesen

  Alt 21. Okt 2014, 10:28
Hallo zusammen,
ich bin ja dabei ein wenig an der Lackierung des Klarlacks der Schutzhülle der Oberfläche der Kryptologie zu kratzen... oder so ähnlich. Ich bin dafür auf die Windows Crypt API umgestiegen, da die mich relativ schnell und mit zahlreichen guten Beispielen zu einem Teilziel (Verschlüsselung mit AES-128) geführt hatte. Jetzt scheitere ich jedoch kläglich an der RSA Verschlüsselung, also nicht der Verschlüsselung an sich, sondern daran den Public Key aus gleich zwei verschiedenen Keyfiles (eine .der und eine .cer mit dem gleichen Key zum Inhalt) auszulesen. Ich habe also mehrere Möglichkeiten zum Auslesen, und nicht eine klappt. Ich bekomme immer "ASN1 Ungültiger Kennzeichenwert". Wenn ich das gleiche Zertifikat in Windows öffne, kann ich den Public Key direkt auslesen... Es ist also nicht kaputt. Hier mal der Code wie ich versuche das Zertifikat zu lesen:
Delphi-Quellcode:
  try
    CertPath := 'c:\sinnloserPfad\data';
// Beide Formate liegen vor, egal welche Datei ich einlese...immer das gleiche Ergebnis
    pubCert := TFileStream.Create(CertPath + '\zpr_prod_public_cert.cer', fmOpenRead or fmShareDenyNone);
// pubCert := TFileStream.Create(CertPath + '\zpr_prod_public_key.der', fmOpenRead or fmShareDenyNone);
    try
      SetLength(Buffer, pubCert.Size);
      BufLen := pubCert.read(Pointer(Buffer)^, pubCert.Size); // sollte ich eventuell an dieser Stelle noch irgendwas kodieren/dekodieren Base64 oder so?
    finally
      pubCert.Free;
    end;
  except
    RaiseLastOSError;
    Exit;
  end;

  if Length(Buffer) > 1 then
  begin
    try
      DataLen := 0;
// die folgende Zeile müsste es eigentlich schon tun... Das Ergebnis-Objekt ist aber leer, und der Fehler ist eingangs genannter "ASN1 Ungültig...."
      CertContext := CertCreateCertificateContext(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, @Buffer[0], BufLen);
      if CertContext = nil then // Dann eben die andere Variante, die aber zu exakt dem gleichen Fehler führt :(
         Win32Check(CryptDecodeObjectEx(X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, X509_PUBLIC_KEY_INFO, @Buffer[0], BufLen, CRYPT_ENCODE_ALLOC_FLAG, nil, @PublicKeyInfo, DataLen))
      else
      begin // hier kommen wir gar nicht mehr hin...
        hCProv := __CryptAcquireContext(PROV_RSA_FULL);
        if Win32Check(CryptImportPublicKeyInfo(hCProv, X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, @certcontext.pCertInfo.SubjectPublicKeyInfo, hKey)) then
        begin
          DataLen := Length(einKey);
          BufLen := DataLen;
          Win32Check(CryptEncrypt(hkey, 0, True, 0, @EinKey[0], DataLen, BufLen));
          SetLength(einKey, DataLen);
        end;
      end;
    finally
      Win32Check(CryptReleaseContext(hCProv, 0));
    end;
  end;
Hat jemand eine Idee? Wo mache ich den Fehler?

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock
Online

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#2

AW: Public Key aus einem X509 Zertifikat auslesen

  Alt 22. Okt 2014, 15:28
Crosspost zu http://stackoverflow.com/questions/2...09-certificate

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock
Online

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#3

AW: Public Key aus einem X509 Zertifikat auslesen

  Alt 23. Okt 2014, 13:35
Tja, wincrypt hat zu Recht den Ruf kompliziert zu sein...und zwar absolut unnötigerweise. Es ist schlicht nicht mit vertretbarem Aufwand möglich die simple Aufgabe durchzuführen. Egal, ich verwende jetzt OpenSSL dafür (PubKey auslesen und RSA verschlüsseln). Da ist das ein Klacks... Mir tun alle Leid, die nur auf die MS API bauen dürfen.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz