Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Java - x509 p12 e chiavi asimmetriche
Forum - Java - x509 p12 e chiavi asimmetriche

Avatar
lespeol (Normal User)
Newbie


Messaggi: 12
Iscritto: 05/05/2010

Segnala al moderatore
Postato alle 13:01
Mercoledì, 05/05/2010

Scusate la vaghità del topic ma il problema è vasto e non riesco a venirne a capo.

Devo fare un programma in java che crei chiave privata e chiave pubblica (RSA).

La pubblica devo poterla inserire in un keystore E devo poterla usare in un certificato x509 da usare però in formato p12. Perché mi serve sia lato server per riconoscere la firma con la chiave privata (quindi la tengo in un keystore) e sia lato client per poter accedere a un sito "sicuro" (p12).

Ho letto molto ma non trovo quello che cerco.

Spero mi possiate aiutare.

Grazie in anticipo :k:

PM Quote
Avatar
lespeol (Normal User)
Newbie


Messaggi: 12
Iscritto: 05/05/2010

Segnala al moderatore
Postato alle 13:03
Sabato, 15/05/2010
Risolto... ma sembra che non importi a nessuno.

Fa nulla :k:

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 14:12
Sabato, 15/05/2010
quando si giunge a una soluzione senza che qualcuno ti abbia risposto è buona norma condividerla.

PM Quote
Avatar
lespeol (Normal User)
Newbie


Messaggi: 12
Iscritto: 05/05/2010

Segnala al moderatore
Postato alle 14:20
Sabato, 15/05/2010
Sì sì... appena metto tutto insieme posto.

PM Quote
Avatar
lespeol (Normal User)
Newbie


Messaggi: 12
Iscritto: 05/05/2010

Segnala al moderatore
Postato alle 13:13
Domenica, 16/05/2010
Allora:

questa classe serve per creare un certificato pkcs12 partendo dal certificato della CA:

X509CertificateGenerator.java

Codice sorgente - presumibilmente Java

  1. public class X509CertificateGenerator {
  2.        
  3.         private X509Certificate caCert;
  4.     private RSAPrivateCrtKeyParameters caPrivateKey;
  5.        
  6.        
  7.     public X509CertificateGenerator()
  8.                
  9.         String caFile = "my-ca.p12";
  10.         String caPassword = "password";
  11.         String caAlias = "super-CA"; // io ho messo queto alias
  12.                
  13.         KeyStore caKs = KeyStore.getInstance("PKCS12");
  14.                
  15.         caKs.load(new FileInputStream(new File(caFile)), caPassword.toCharArray());
  16.                
  17.         // carica la chiave dal keystore
  18.         Key key = caKs.getKey(caAlias, caPassword.toCharArray());
  19.         if (key == null) {
  20.             throw new RuntimeException("Got null key from keystore!");
  21.         }
  22.         RSAPrivateCrtKey privKey = (RSAPrivateCrtKey) key;
  23.         caPrivateKey = new RSAPrivateCrtKeyParameters(privKey.getModulus(), privKey.getPublicExponent(), privKey.getPrivateExponent(),
  24.                                                                                                           privKey.getPrimeP(), privKey.getPrimeQ(), privKey.getPrimeExponentP(), privKey.getPrimeExponentQ(), privKey.getCrtCoefficient());
  25.         // poi prendo il certificato
  26.         caCert = (X509Certificate) caKs.getCertificate(caAlias);
  27.         if (caCert == null) {
  28.             throw new RuntimeException("Got null cert from keystore!");
  29.         }
  30.         caCert.verify(caCert.getPublicKey());
  31.     }
  32.        
  33.     public boolean createCertificate(String dn, String reparto, int validityDays, String exportFile, String exportPassword) throws
  34.         SecureRandom sr = new SecureRandom();
  35.                
  36.         PublicKey pubKey;
  37.         PrivateKey privKey;
  38.  
  39.                 // genero le chiavi
  40.         KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
  41.         keyGen.initialize(1024, sr);
  42.         KeyPair keypair = keyGen.generateKeyPair();
  43.         privKey = keypair.getPrivate();
  44.         pubKey = keypair.getPublic();
  45.        
  46.         Calendar expiry = Calendar.getInstance();
  47.         expiry.add(Calendar.DAY_OF_YEAR, validityDays);
  48.                
  49.         ////////////////////////////////////////
  50.         /// Qui vanno i dati del certificato ///
  51.         ////////////////////////////////////////
  52.         X509Name x509Name = new X509Name("CN="+dn+", OU=ASL-Medico, O="+reparto+", L=perugia, ST=italia, C=it");
  53.                
  54.         V3TBSCertificateGenerator certGen = new V3TBSCertificateGenerator();
  55.         certGen.setSerialNumber(new DERInteger(BigInteger.valueOf(System.currentTimeMillis())));
  56.         certGen.setIssuer(PrincipalUtil.getSubjectX509Principal(caCert));
  57.         certGen.setSubject(x509Name);
  58.                
  59.         DERObjectIdentifier sigOID = X509Util.getAlgorithmOID("SHA1WithRSAEncryption");
  60.         AlgorithmIdentifier sigAlgId = new AlgorithmIdentifier(sigOID, new DERNull());
  61.         certGen.setSignature(sigAlgId);
  62.         certGen.setSubjectPublicKeyInfo(new SubjectPublicKeyInfo((ASN1Sequence) new ASN1InputStream(new ByteArrayInputStream(pubKey.getEncoded())).readObject()));
  63.         certGen.setStartDate(new Time(new Date(System.currentTimeMillis())));
  64.         certGen.setEndDate(new Time(expiry.getTime()));
  65.                
  66.         // attenzione: SHA1+RSA!
  67.         SHA1Digest digester = new SHA1Digest();
  68.         AsymmetricBlockCipher rsa = new PKCS1Encoding(new RSAEngine());
  69.         TBSCertificateStructure tbsCert = certGen.generateTBSCertificate();
  70.                
  71.         DEROutputStream dOut = new DEROutputStream(bOut);
  72.         dOut.writeObject(tbsCert);
  73.                
  74.         // firmiamo
  75.         byte[] signature;
  76.                
  77.                
  78.         // tramite JCE
  79.         PrivateKey caPrivKey = KeyFactory.getInstance("RSA").generatePrivate(new RSAPrivateCrtKeySpec(caPrivateKey.getModulus(), caPrivateKey.getPublicExponent(),
  80.                                                                                                                                                                                                           caPrivateKey.getExponent(), caPrivateKey.getP(), caPrivateKey.getQ(),
  81.                                                                                                                                                                                                           caPrivateKey.getDP(), caPrivateKey.getDQ(), caPrivateKey.getQInv()));
  82.                
  83.         Signature sig = Signature.getInstance(sigOID.getId());
  84.         sig.initSign(caPrivKey, sr);
  85.         sig.update(bOut.toByteArray());
  86.         signature = sig.sign();
  87.                
  88.         // qui creiamo il certificato
  89.         ASN1EncodableVector v = new ASN1EncodableVector();
  90.                
  91.         v.add(tbsCert);
  92.         v.add(sigAlgId);
  93.         v.add(new DERBitString(signature));
  94.                
  95.         X509CertificateObject clientCert = new X509CertificateObject(new X509CertificateStructure(new DERSequence(v)));
  96.         clientCert.verify(caCert.getPublicKey());
  97.                
  98.         // esportiamo come PKCS12
  99.                
  100.         PKCS12BagAttributeCarrier bagCert = clientCert;
  101.         bagCert.setBagAttribute(PKCSObjectIdentifiers.pkcs_9_at_friendlyName,new DERBMPString("Certificate for IPSec WLAN access"));
  102.         bagCert.setBagAttribute(PKCSObjectIdentifiers.pkcs_9_at_localKeyId,new SubjectKeyIdentifierStructure(pubKey));
  103.                
  104.         KeyStore store = KeyStore.getInstance("PKCS12");
  105.                
  106.         store.load(null, null);
  107.                
  108.         X509Certificate[] chain = new X509Certificate[2];
  109.         // prima il client, poi la CA
  110.         chain[0] = clientCert;
  111.         chain[1] = caCert;
  112.                
  113.         store.setKeyEntry("", privKey, exportPassword.toCharArray(), chain);
  114.                
  115.         FileOutputStream fOut = new FileOutputStream(exportFile);
  116.                
  117.         store.store(fOut, exportPassword.toCharArray());
  118.                
  119.         return true;
  120.     }
  121.        
  122. }



Spero sia chiaro... gli "import" sono tantissimi. Cmq ho usato le librerie di bouncycastle.


Mentre per inserire le chiavi in un keystore patendo da un file PKCS12 ho fatto così:

kStoreCliente.java

Codice sorgente - presumibilmente Java

  1. public class kStoreCliente {
  2.        
  3.     private String caAlias;
  4.     private String caPassword;
  5.     private String caFile;
  6.     private String aliasIn;
  7.     private String storeFile;
  8.     private String keyStorePass;
  9.        
  10.     public kStoreCliente(String pass, String fileClienteCert) {
  11.                
  12.         caPassword = pass; //canestro
  13.         caFile = fileClienteCert; //caFile = "my-ca.p12";
  14.                 aliasIn = "cliente";
  15.         storeFile = "my-store.keystore";
  16.         keyStorePass = "storepass";
  17.         caAlias = ""; // l'ho lasciato vuoto per comodità
  18.         }
  19.        
  20.     public void creaKStore() {
  21.         try {
  22.                        
  23.             //Load del file my-ca.p12
  24.             KeyStore caKs = KeyStore.getInstance("PKCS12");
  25.             caKs.load(new FileInputStream(new File(caFile)), caPassword.toCharArray());
  26.                        
  27.                        
  28.             //Test sull'esistenza del keystore
  29.             if (new File(storeFile).exists()) {
  30.                                
  31.                                
  32.                 //Se il keystore esiste effettuo il load
  33.                 System.out.println("Ho trovato keystore - file: " + storeFile);
  34.                 KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
  35.                 FileInputStream in = new FileInputStream(storeFile);
  36.                 ks.load(in, keyStorePass.toCharArray());
  37.                 in.close();
  38.                                
  39.                 try {
  40.                                        
  41.                     // Estraggo il certificato relativo all'alias CA (aliasIN - vedi dopo)
  42.                     java.security.cert.Certificate cert = ks.getCertificate(aliasIn);
  43.                                        
  44.                     if (cert != null) {
  45.                                                
  46.                         System.out.println("Trovato certificato di " + aliasIn + " nel keystore - file: " + storeFile);
  47.                         PublicKey publicKey = cert.getPublicKey();
  48.                                                
  49.                     } else {
  50.                                                
  51.                         System.out.println("Non ho trovato certificato di " + aliasIn + " nel keystore - file: " + storeFile);
  52.                     }
  53.                                        
  54.                 } //catch (UnrecoverableKeyException e) { System.out.println(e.toString());}
  55.                 //catch (NoSuchAlgorithmException e) { System.out.println(e.toString()); }
  56.                 catch (KeyStoreException e) {
  57.                     System.out.println(e.toString());
  58.                 } catch (Exception e) {
  59.                     System.out.println(e.toString());
  60.                 }
  61.                                
  62.             } else {
  63.                                
  64.                 //Se il keystore non esiste creo un nuovo keystore
  65.                 System.out.println("Non ho trovato keystore - file: " + storeFile);
  66.                 KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
  67.                 ks.load(null, null);
  68.                                
  69.                 try {
  70.                                        
  71.                     // Get private key
  72.                     Key key = caKs.getKey(caAlias, caPassword.toCharArray());
  73.                                        
  74.                     if (key instanceof PrivateKey) {
  75.                         // Get certificate of public key
  76.                         java.security.cert.Certificate cert = caKs.getCertificate(caAlias);
  77.                         // Get public key
  78.                         PublicKey publicKey = cert.getPublicKey();
  79.                         // Return a key pair
  80.                         KeyPair keys = new KeyPair(publicKey, (PrivateKey) key);
  81.                                                
  82.                         //inserisco il certificato di my-ca dal file .p12 nel keystore appena creato
  83.                         //con alias CA
  84.                         ks.setCertificateEntry(aliasIn, cert);
  85.                                                
  86.                     }
  87.                                        
  88.                 } catch (UnrecoverableKeyException e) {
  89.                     System.out.println(e.toString());
  90.                 } catch (NoSuchAlgorithmException e) {
  91.                     System.out.println(e.toString());
  92.                 } catch (KeyStoreException e) {
  93.                     System.out.println(e.toString());
  94.                 } catch (Exception e) {
  95.                     System.out.println(e.toString());
  96.                 }
  97.                                
  98.                 FileOutputStream out = new FileOutputStream(storeFile);
  99.                                
  100.                 //Salvo il keystore su file con password
  101.                 ks.store(out, keyStorePass.toCharArray());
  102.                 out.close();
  103.                 System.out.println("Creato keystore - file: " + storeFile);
  104.                 JOptionPane.showMessageDialog(null, "KeyStore creato con successo", "Successo", JOptionPane.INFORMATION_MESSAGE);
  105.             }
  106.                        
  107.         } catch (Exception e) {
  108.             System.out.println(e.toString());
  109.         }
  110.                 return;
  111.     }
  112. }



Spero che queste semplici classi possano essere utili. Per me lo sono state.

PS: è codice grezzo non ci sono grossi controlli. Ma funziona.

Ultima modifica effettuata da lespeol il 16/05/2010 alle 13:15
PM Quote