2009-01-30 7 views
6

Ich habe es geschafft, Sun's MSCAPI provider in meiner Anwendung zu verwenden. Das Problem, das ich jetzt habe, ist, dass es immer ein Fenster auftaucht, um nach einem Passwort zu fragen, obwohl ich es im Code zur Verfügung gestellt habe. Dies ist ein Problem, da ich die Kryptographie-Funktionalität in einem Webservice benötige.Java-Sicherheit - MSCAPI-Anbieter: Wie ohne Passwort-Popup zu verwenden?

Hier ist der Code, den ich jetzt habe:

String alias = "Alias to my PK"; 
char[] pass = "MyPassword".toCharArray(); 

KeyStore ks = KeyStore.getInstance("Windows-MY"); 
ks.load(null, pass); 
Provider p = ks.getProvider(); 

Signature sig = Signature.getInstance("SHA1withRSA",p); 
PrivateKey key = (PrivateKey) ks.getKey(alias, pass) 

sig.initSign(key); 
sig.update("Testing".getBytes()); 
sig.sign(); 

Das funktioniert großartig, aber ich bekomme ein Popup nach dem Passwort gefragt, wenn die letzte Zeile ausgeführt wird. Wie verhindere ich das?

Antwort

4

Der MSCAPI Provider unterstützt das Passwort nicht zu CAPI bietet:

Ein Kompatibilitätsmodus für Anwendungen unterstützt, die ein Passwort übernehmen muss geliefert werden. Es erlaubt (aber ignoriert) ein Nicht-Null-Passwort. Der Modus ist standardmäßig aktiviert. (1)

Um das Passwort durch CAPI, setzen Sie CryptSetKeyParam mit dem undokumentierten KP_KEYEXCHANGE_PIN oder KP_SIGNATURE_PIN und hoffen, dass die zugrunde liegende Hardware-Token-Provider unterstützt es nennen müssen. (Sie sind nicht vollständig undokumentiert - die Dokumentation für Windows CE und Windows Mobile erwähnt sie (2) und sie sind in den Header-Dateien enthalten).

+0

Ich weiß, das ist ein wenig alt, aber ich brauche genau das gleiche. Haben Sie ein Beispiel dafür, um das Pin-Popup zu vermeiden? –

1

Meine Vermutung ist, dass Windows das Pop-up auftaucht.

Importieren Sie den Schlüssel erneut mit dem Zertifikatimport-Assistenten. Stellen Sie jedoch sicher, dass Sie die folgende Option im Bildschirm "Passwort" nicht aktivieren.

[_] Ermöglichen Sie einen starken Schutz des privaten Schlüssels. Sie werden jedes Mal aufgefordert, wenn der private Schlüssel von einer Anwendung verwendet wird, wenn Sie diese Option aktivieren.

+0

Vielen Dank für Ihre Antwort, aber Ich kann das Zertifikat nicht erneut importieren, da dies nicht der Fall ist eine Datei, aber ein Hardware-Token, das ich verwende. – Sietse

+0

Ich habe ein leeres Passwort in Java-Code. Wenn ich Token zum ersten Mal auf USB einfüge und eine Java-Anwendung ausführe, wird das Popup-Fenster der Token-Middleware angezeigt, und der private Schlüssel ist zugänglich. Aber wenn ich die Anwendung zweimal und öfter benutze, bleibt die Anwendung stehen. Ich muss das Token wieder entfernen und einfügen. –

0

aufgelöst ich dieses Problem, den Anbieter wie folgt einstellen:

signeData = gen.generate(content, ks.getProvider());

Wo

ks ist ein KeyStore und

gen ist ein CMSSignedDataGenerator

Verwandte Themen