|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 581
|
[JAVA] Prelevare da Keystore PKCS#12 Chiave privata e file di certificato
ciao ragazzi come da titolo cerco un programma java che dato un PKCS#12 mi crea 2 nuovi file uno contenente solo la chiave privata che mi servirà dopo per firmare un messaggio e il corrispettivo certificato con la chiave pubblica in formato der.
Grazie mille Ciao Ciao
__________________
Toshiba M40-281 Ultima modifica di ermasto : 06-06-2006 alle 18:30. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 581
|
nessuno mi puo aiutare
![]()
__________________
Toshiba M40-281 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 581
|
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
__________________
Toshiba M40-281 |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Codice:
Enumeration aliases = ks.aliases(); while(aliases.hasMoreElements()) System.out.println(aliases.nextElement()); |
![]() |
![]() |
![]() |
#5 | ||
Senior Member
Iscritto dal: Mar 2004
Messaggi: 581
|
ho provato con il tuo codice kingv ma mi torna un errore: il codice modificato è:
Quote:
Exception in thread "main" java.lang.NullPointerException at Perform.key.main(key.java:28) a proposito questo metodo: Quote:
Grazie mille
__________________
Toshiba M40-281 Ultima modifica di ermasto : 06-06-2006 alle 21:09. |
||
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Codice:
package Perform; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.security.*; import java.security.cert.CertificateException; import java.util.*; public class key { public static void main(String[] args) { try { KeyStore ks = KeyStore.getInstance("PKCS12"); InputStream in = new FileInputStream("e://x509pri.p12"); ks.load(in, null); Enumeration aliases = ks.aliases(); String alias = (String)aliases.nextElement(); PrivateKey priv = (PrivateKey) ks.getKey(alias, "aliaseskeypass".toCharArray()); byte[] encodedKey = priv.getEncoded(); /* 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(); /* save the certificate in a file named "suecert" */ FileOutputStream certfos = new FileOutputStream("suecert.der"); certfos.write(encodedCert); certfos.close(); } catch (KeyStoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (CertificateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnrecoverableKeyException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } di solito i p12 sono protetti da password (che può essere differente da quella della chiave). sei sicuro di quel "null" nella load? |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
sì dovrebbe essere ok. se non sei sicuro controlla col metodo getFormat() di PrivateKey |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 581
|
io lo scarico dalla mia CA e se provo a installarlo nel browser mi chiede solo la password per la chiave privata
cmq ho provato il tuo codice e mi da quest errore 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:30) 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 poi anche se tolgo la parte che si riferisce alla chiave privata e voglio solo estrarre il certificato mi da quest errore. Exception in thread "main" java.lang.NullPointerException at Perform.key.main(key.java:40)
__________________
Toshiba M40-281 |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
puo' essere che le password siano coincidenti, per questo ti viene chiesta una volta sola.
prova a mettere qui: ks.load(in, null); la stessa password con cui proteggi la chiave privata al posto di null. fammi sapere. |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 581
|
Quote:
Poi ho provato a mettere in ks.load(in,"aliaseskeypass".toCharArray()) e mi caccia quest'altra eccezione java.io.IOException: failed to decrypt safe contents entry: javax.crypto.BadPaddingException: Given final block not properly padded at com.sun.net.ssl.internal.ssl.PKCS12KeyStore.engineLoad(Unknown Source) at java.security.KeyStore.load(Unknown Source) at Perform.key.main(key.java:24) 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$PBEWithSHA1AndRC2_40.engineDoFinal(DashoA12275) at javax.crypto.Cipher.doFinal(DashoA12275) ... 3 more cosa puo essere?? Grazie mille x l'aiuto
__________________
Toshiba M40-281 |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
"aliaseskeypass" è la password.....
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 581
|
niente da fare mi sa sempre lo stesso errore:
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)1 non riesco proprio a capire da cosa è provocato ![]()
__________________
Toshiba M40-281 |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 581
|
allora il programma ora funziona in parte ecco il codice:
[quote] [/package Perform; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.security.*; import java.security.cert.CertificateException; import java.util.*; public class key { public static void main(String[] args) { try { 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, "1234567890".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(); } catch (KeyStoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (CertificateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnrecoverableKeyException e) { //TODO Auto-generated catch block e.printStackTrace(); } } } [quote] infatti mi stampa la chiave e me la salva pure anche se devo vedere in che estensione salvarla, perche penso che .der non va bene sai in che formato si salvano i pkcs#8?? solo che dopo avermi fatto stampare la chiave privata mi da quest'ecezione sul metodo: byte[] encodedCert = cert.getEncoded(); eccola qua: Exception in thread "main" java.lang.NullPointerException at Perform.key.main(key.java:43) e non capisco come mai ![]()
__________________
Toshiba M40-281 |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
io ti rispondo ma non mi leggi...
![]() sostituisci: ks.load(in, null); con: ks.load(in, "1234567890"); |
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 581
|
Quote:
![]() ![]() Scusami tanto e grazie mille per il tuo prezioso aiuto
__________________
Toshiba M40-281 |
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
Quote:
no problem stavo scherzando ovviamente ![]() CIao |
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jan 2002
Città: Spagna
Messaggi: 556
|
è proprio il topic che cercavo:
ho creato una coppia di chiavi (pubblica,privata), le vorrei salvare in maniera sicura sul pc. Qual è la combinazione migliore( + sicura ) per il salvataggio??...Le chiavi le creo cosi': Codice:
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA", "BC"); // keyGen.initialize(512); KeyPair chiaviRSA = keyGen.generateKeyPair(); PrivateKey chiavePrivata = chiaviRSA.getPrivate(); PublicKey chiavePublica = chiaviRSA.getPublic(); |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 581
|
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??
__________________
Toshiba M40-281 |
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Jan 2002
Città: Spagna
Messaggi: 556
|
che differenza c'e' tra pcks 8 e 12??? se salvo la privata con pkcs 8,.,.non capisco come la salva con pcks 8,.., un aiuto pls
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Jan 2001
Città: Milano
Messaggi: 5707
|
ermasto> non ho mai usato wss4j anche se l'argomento mi interessa parecchio. non posso aiutarti ma se trovi dei link interessanti postali
mazza> pkcs8 è un formato per le chiavi private (neanche molto usato per quello che ho visto), pkcs12 invece è lo standard per contenere chiavi e certificati in un file (protetto da crittografia a chiave simmetrica). |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:17.