Da ich heute bereits zum zweiten Mal auf diesen Fehler traf (das letzte Mal liegt schon einige Wochen zurück), dachte ich mir, dass ich ihn mal hier verewige:

Wenn die Fehlermeldungen "Bad Key" oder "Invalid handle" in Zusammenhang mit einer "System.Security.Cryptography.CryptographicException" bei euch fallen, solltet ihr zuerst einmal die Schreibrechte der Private-Key-Datei testen und im zweiten Schritt dann überprüfen, ob euer Zertifikat überhaupt die benötigten Werte enthält.

 

Mein Problem: Ich versuchte ein X.509-Zertifikat zu verwenden, um ein Saml-Token zu signieren. Dummerweise traten gleich an zwei verschiedenen Stellen Fehler auf, die ein unüberlegter Catch-Block (im Zusammenspiel mit einem nicht funktionierenden Logger) so verschleierte, dass eine längere Suche von Nöten war.

Beide Fehler traten übrigens beim Serialisieren des Tokens auf.

 

Zwei Probleme und ihre Lösungen:

Problem 1 - "Invalid handle": Dieser Fehler trat auf, wenn das Script nicht auf die Private-Key-Datei des Zertifikats zugreifen konnte. Der Benutzer "NETWORK SERVICE" braucht hier zumindest Leserechte.

Wie finde ich die Private-Key-Datei? Dazu gibt es von Microsoft eine schöne Sammlung namens WSE "Web Service Enhancements"... die Version, die meiner Ansicht nach am neusten ist, ist Version 3.0, wenn ihr auch bei Google zuerst auf die 2.0er Version stoßen werdet.

Diese Sammlung beinhaltet ein Tool namens "WSE X.509 Certificate Tool", mit welchem man durch einfaches Auswählen von Dropdowns und Buttons alle Details zu einem bestimmten Zertifikat erfahren kann. Hier zum Beispiel die Ansicht des Testzertifikats, welches ich mir ausgestellt habe.

image

Am unteren Ende des Tools, findet man einen Button "View Private Key File Properties", welcher einen direkt in den Eigenschaften-Dialog der entsprechenden Datei führt. Die neueren Windows-Systeme enthalten dort einen Reiter "Sicherheit", mit dem man direkt der Datei den entsprechenden Benutzer (in unserem Fall "NETWORK SERVICE") zuweisen kann. Sobald die Datei für das Script zugänglich ist, verschwindet die "invalid handle"-Fehlermeldung.

 

Problem 2 - "Bad key": Wer lesen kann ist klar im Vorteil, denn auch hier liefert das Tool eine direkte Erklärung:

image

Sobald das eine Feld links (siehe Bild 1) durch drei Felder (siehe Bild 2) ersetzt wird, erscheint rechts in der Beschreibung der Text "Wenn der Subject Key Identifier nicht vorhanden ist, werden drei Felder angezeigt". Hätte ich hier beim zweiten Anlauf richtig gelesen, hätte mir das einige Mühe erspart, denn das Zertifikat, dass ich mir habe ausstellen lassen, verfügte schlichtweg nicht über den sog. "Subject Key Identifier", welcher nötigt ist, um das Saml-Token zu authentifizieren. Sobald man ein Zertifikat mit dem oben genannten SKI besitzt, wird ganz sicher auch die Fehlermeldung verschwinden.

 

Die WSE Tools findet man auf der Microsoft-Download-Seite.

 

Einen kleinen Tipp hätte ich noch zur Hand. Wenn ihr eure Software gegen Zertifikate testen wollt, dann könnt ihr euch Zertifikate mit allen möglichen Kombinationen an Rechten mit einem Tool von EldoS namens "Crypto4™ PKI" erstellen. Dieses Tool ist kostenpflichtig, erstellt aber auch in der 30-Tage Testversion wunderschöne Zertifikate ;-).