Announcement

Collapse
No announcement yet.

X509Certificate von einer SmartCard lesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • X509Certificate von einer SmartCard lesen

    Hi zusammen,

    Vorab ein kleines Statement: ich habe recht wenig Ahnung von kryptografischen Mechanismen und Schnittstellen, daher kann es sein, dass die Antwort zwar für Euch offensichtlich ist, wenn man den Zusammenhang zwischen A und B kennt, für mich aber alles böhmische Dörfer sind.

    Ich habe ein kleines Problem: Um bestimmte Aktionen durchzuführen muss meine Software die Identifikation des Ausführenden feststellen, dazu soll sich der User über seine SmartCard und PIN identifizieren, von der Smartcard soll dann das Zertifikat ausgelesen werden und das Zertifikat soll dann über eine firmeninterne Datenbank verifiziert werden. Das ganze muss unabhängig davon passieren können, wer gerade eingeloggt ist, d.h. wenn z.B. für eine Aktion die Erlaubnis von mehreren Usern erforderlich ist, muss sich nicht jeder neu einloggen, um sein Placet einzutragen, sondern einer loggt sich ein und startet die Software, und alle geben nacheinander ihre Karte ein, klicken auf einen Button und geben die PIN ein. Ich muss also anhand der ausgelesenen Daten den User identifizieren können.

    Das Problem, das ich nun habe ist, dass die Überprüfung am zentralen Dienst über X509Certificates zu handhaben ist (indem ich versuche einen über die Karte signierten Text über per PKCS.SignedCms.CheckSignature mit den aus dem Firmenverzeichnis gelesenen Zertifikaten zu verifizieren), alle Code-Beispiele über Zertifikate, die ich bisher dazu gefunden habe, aber die Zertifikate aus dem lokalen Zertifikatsspeicher holen. Zwar werden die Zertifikate aus der Karte dorthin kopiert, wenn ich sie einstecke, da verbleiben die Zertifikate aber auch wenn ich die Karte wieder rausziehe, wodurch nicht mehr sichergestellt ist, dass aufgrund der Existenz eines Zertifikats die Karte auch wirklich eingelegt ist. Ich muss also irgendwie explizit von der Karte lesen können, finde aber keinen StoreIdentifier oder Namen, der mir dies einschränkt.

    Die einzige Möglichkeit die ich gefunden habe, mit Sicherheit auf die Karte zuzugreifen, habe ich wenn ich CSP-Techniken verwende, und bei den CSP-Parametern den Provider "Siemens Card API CSP" angebe. Das einzige was ich aber dazu im Netz gefunden habe, ist ein RSACryptoServiceProvider, der mir dann zwar Daten verschlüsseln und signieren kann, sowie die Signatur verifizieren und wieder entschlüsseln, wie ich da aber ein X509-Zertifikat rausbekomme, habe ich nicht gefunden. Und wie ich die User-Daten auslesen kann, um überhaupt festzustellen, wessen Karte das ist, weiss ich da auch nicht.

    Ich wäre also dankbar, wenn mir jemand sagen könnte wie ich entweder sicherstellen kann, dass ein bestimmtes Zertifikat von der Karte stammt, oder wie ich aus dem RSACryptoServiceProvider heraus ein X509-Zertifikat bekomme, und die User-Daten auslese.

    Danke im Voraus
    Martin Dietz

  • #2
    Exception im Konstruktor von CmsSigner

    Also, ich bin bei weiteren Recherchen auf die Möglichkeit gestoßen, einen CmsSigner (den ich für die Signierung von Daten ja eh benötige) mit dem CSPParameters Objekt zu kreieren, also

    Code:
     
    ...
                Dim csp As New CspParameters(1, "Siemens Card API CSP") 
                csp.Flags = CspProviderFlags.UseDefaultKeyContainer
                csp.ParentWindowHandle = Me.Handle
    
                Dim Signer As New CmsSigner(csp)
    ...
    Der Konstruktor läuft aber auf eine CryptographicException mit der Meldung, das Handle sei ungültig. Da in keiner Beschreibung dieser Funktion eine solche Exception erwähnt wird, weiß ich nun auch nicht, was ich falsch mache, und wie ich das beheben kann.

    Kann mir diesbezüglich vielleicht noch jemand helfen?

    Comment

    Working...
    X