ermasto (Normal User)
Newbie
Messaggi: 9
Iscritto: 06/06/2006
|
salve a tutti questo è il mio primo post su questo forum e mi servirebbe un aiuto su un problema java che mi affligge.
Ho una CA che emette certificati e mi faccio dare da essa un Keystore PKCS#12 ora devo sviluppare un client java che da questo keystore preleva e risalva in formato .der il certificato x509 che mi servirà in seguito e che mi prelevi anche la chiave privata che userò per firmare alcuni messaggi.
Ho visto che esiste keytool che fa queste cose ma mi serve un programmino java che devo importare su più macchine.
Spero che mi potete aiutare
Aspetto vostre notizie, grazie
Ciao Ciao
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Ma keytool non è distribuito assieme al JDK e quindi è disponibile per tutte le piattaforme?
|
|
ermasto (Normal User)
Newbie
Messaggi: 9
Iscritto: 06/06/2006
|
Postato originariamente da pierotofy:
Ma keytool non è distribuito assieme al JDK e quindi è disponibile per tutte le piattaforme? |
in effetti non sono stato chiaro, mi serve in java perche deve essere fatto in automatico senza che l'utente digita ogni volta i comandi |
|
ermasto (Normal User)
Newbie
Messaggi: 9
Iscritto: 06/06/2006
|
KeyStore ks = KeyStore.getInstance("PKCS12");
InputStream in = new FileInputStream("x509pri.p12");
ks.load(in,null);
PrivateKey priv = (PrivateKey) ks.getKey("","");
java.security.cert.Certificate cert = ks.getCertificate("");
byte[] encodedCert = cert.getEncoded();
FileOutputStream certfos = new FileOutputStream("suecert.der");
certfos.write(encodedCert);
certfos.close();
allora ho trovato questo programmino che fa al caso mio ma ho due piccoli problemini
nel metodo ks.getkey() vuole essere passato l'alias e la password, ma il problema è che non so qual'è l'alias del mio certificato e lo stesso vale per il metodo getCertificate. c'è un modo per rimediare a ciò??
Grazie mille
|
|
netarrow (Admin)
Guru^2
Messaggi: 2502
Iscritto: 12/05/2004
|
|
|
ermasto (Normal User)
Newbie
Messaggi: 9
Iscritto: 06/06/2006
|
ho provato con aliases il codice è il seguente:
KeyStore ks = KeyStore.getInstance("PKCS12");
InputStream in = new FileInputStream("e://x509pri.p12");
ks.load(in, null);
Enumeration aliases = ks.aliases();
String alias=null;
while(aliases.hasMoreElements())
{
alias = (String)aliases.nextElement();
System.out.println(alias);
}
PrivateKey priv = (PrivateKey) ks.getKey(alias, "aliaseskeypass".toCharArray());
byte[] encodedKey = priv.getEncoded();
System.out.println(priv);
/* save the certificate in a file named "suecert" */
FileOutputStream keyfos = new FileOutputStream("suekey.der");
keyfos.write(encodedKey);
keyfos.close();
//You can extract the public key certificate from the keystore and save its encoded bytes to a file named suecert, via the following.
java.security.cert.Certificate cert = ks.getCertificate(alias);
byte[] encodedCert = cert.getEncoded();
System.out.println(" Certificate : " + cert);
/* save the certificate in a file named "suecert" */
FileOutputStream certfos = new FileOutputStream("suecert.der");
certfos.write(encodedCert);
certfos.close();
ma mi restituisce quest'errore che non riesco a capire:
1
java.security.UnrecoverableKeyException: Get Key failed: Given final block not properly padded
at com.sun.net.ssl.internal.ssl.PKCS12KeyStore.engineGetKey(Unknown Source)
at java.security.KeyStore.getKey(Unknown Source)
at Perform.key.main(key.java:32)
Caused by: javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.SunJCE_h.b(DashoA12275)
at com.sun.crypto.provider.SunJCE_h.b(DashoA12275)
at com.sun.crypto.provider.SunJCE_ab.b(DashoA12275)
at com.sun.crypto.provider.PKCS12PBECipherCore$PBEWithSHA1AndDESede.engineDoFinal(DashoA12275)
at javax.crypto.Cipher.doFinal(DashoA12275)
... 3 more
sapete illuminarmi su quest'errore?
Grazie mille
|
|
ermasto (Normal User)
Newbie
Messaggi: 9
Iscritto: 06/06/2006
|
avevo fatto un errore io nel settare la password della chiave ora va bene quella parte per salvare la chiave privata?? se si che estensione ci devo dare??
poi un altra cosa il programma mi da un errore su questo metodo:
byte[] encodedCert = cert.getEncoded();
mi dice:
Exception in thread "main" java.lang.NullPointerException
at Perform.key.main(key.java:43)
come mai mi restituisce quest'errore?
Grazie Mille
|
|
netarrow (Admin)
Guru^2
Messaggi: 2502
Iscritto: 12/05/2004
|
vuol dire che c'è un oggetto che viene usato senza venire inizializzato, in sostanza usi qualcosa che punta a null.
Probabilmente è cert l'istanza non inizializzata.
ciao
Ultima modifica effettuata da netarrow il 08/06/2006 alle 18:16 |
|
ermasto (Normal User)
Newbie
Messaggi: 9
Iscritto: 06/06/2006
|
ok ci sono riuscito avevo un errore nel codice e non me ne ero accorto.
ora un altro passo che devo fare è il seguente:
devo creare un messaggio soap e aggiungere ad esso un security token che è il certificato x509 e poi tutto questo messaggio soap lo devo firmare con la chiave privata che appartiene al certificato
Per quanto riguarda la creazione del messaggio soap non ci sono problemi ma non sono riuscito a trovare nulla su come aggiungere il token x509, ho letto in giro che devo usare wss4j ma non ho trovato una buona guida e cercare in tutte le API è uno sbattimento assurdo, che tu sappia esiste una guida o qualche sito che lo spiega meglio magari con qualche esempio??
Grazie
|
|