lespeol (Normal User)
Newbie
Messaggi: 12
Iscritto: 05/05/2010
|
Allora:
questa classe serve per creare un certificato pkcs12 partendo dal certificato della CA:
X509CertificateGenerator.java
Codice sorgente - presumibilmente Java |
public class X509CertificateGenerator { private RSAPrivateCrtKeyParameters caPrivateKey; public X509CertificateGenerator() String caPassword = "password"; String caAlias = "super-CA"; // io ho messo queto alias // carica la chiave dal keystore Key key = caKs. getKey(caAlias, caPassword. toCharArray()); if (key == null) { } caPrivateKey = new RSAPrivateCrtKeyParameters(privKey.getModulus(), privKey.getPublicExponent(), privKey.getPrivateExponent(), privKey.getPrimeP(), privKey.getPrimeQ(), privKey.getPrimeExponentP(), privKey.getPrimeExponentQ(), privKey.getCrtCoefficient()); // poi prendo il certificato if (caCert == null) { } caCert.verify(caCert.getPublicKey()); } public boolean createCertificate (String dn, String reparto, int validityDays, String exportFile, String exportPassword ) throws IOException, InvalidKeyException, SecurityException, SignatureException, NoSuchAlgorithmException, DataLengthException, CryptoException, KeyStoreException, NoSuchProviderException, CertificateException, InvalidKeySpecException { // genero le chiavi keyGen.initialize(1024, sr); KeyPair keypair = keyGen. generateKeyPair(); privKey = keypair.getPrivate(); pubKey = keypair.getPublic(); expiry. add(Calendar. DAY_OF_YEAR, validityDays ); //////////////////////////////////////// /// Qui vanno i dati del certificato /// //////////////////////////////////////// X509Name x509Name = new X509Name("CN="+dn+", OU=ASL-Medico, O="+reparto+", L=perugia, ST=italia, C=it"); V3TBSCertificateGenerator certGen = new V3TBSCertificateGenerator(); certGen. setSerialNumber(new DERInteger (BigInteger. valueOf(System. currentTimeMillis()))); certGen.setIssuer(PrincipalUtil.getSubjectX509Principal(caCert)); certGen.setSubject(x509Name); DERObjectIdentifier sigOID = X509Util.getAlgorithmOID("SHA1WithRSAEncryption"); AlgorithmIdentifier sigAlgId = new AlgorithmIdentifier(sigOID, new DERNull()); certGen.setSignature(sigAlgId); certGen. setSubjectPublicKeyInfo(new SubjectPublicKeyInfo ((ASN1Sequence ) new ASN1InputStream (new ByteArrayInputStream(pubKey. getEncoded())). readObject())); certGen. setEndDate(new Time(expiry. getTime())); // attenzione: SHA1+RSA! SHA1Digest digester = new SHA1Digest(); AsymmetricBlockCipher rsa = new PKCS1Encoding(new RSAEngine()); TBSCertificateStructure tbsCert = certGen.generateTBSCertificate(); DEROutputStream dOut = new DEROutputStream(bOut); dOut.writeObject(tbsCert); // firmiamo byte[] signature; // tramite JCE caPrivateKey.getExponent(), caPrivateKey.getP(), caPrivateKey.getQ(), caPrivateKey.getDP(), caPrivateKey.getDQ(), caPrivateKey.getQInv())); sig.initSign(caPrivKey, sr); sig.update(bOut.toByteArray()); signature = sig.sign(); // qui creiamo il certificato ASN1EncodableVector v = new ASN1EncodableVector(); v.add(tbsCert); v.add(sigAlgId); v.add(new DERBitString(signature)); X509CertificateObject clientCert = new X509CertificateObject(new X509CertificateStructure(new DERSequence(v))); clientCert.verify(caCert.getPublicKey()); // esportiamo come PKCS12 PKCS12BagAttributeCarrier bagCert = clientCert; bagCert.setBagAttribute(PKCSObjectIdentifiers.pkcs_9_at_friendlyName,new DERBMPString("Certificate for IPSec WLAN access")); bagCert.setBagAttribute(PKCSObjectIdentifiers.pkcs_9_at_localKeyId,new SubjectKeyIdentifierStructure(pubKey)); store.load(null, null); // prima il client, poi la CA chain[0] = clientCert; chain[1] = caCert; store.setKeyEntry("", privKey, exportPassword.toCharArray(), chain); store.store(fOut, exportPassword.toCharArray()); return true; } }
|
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 |
public class kStoreCliente { caPassword = pass; //canestro caFile = fileClienteCert; //caFile = "my-ca.p12"; aliasIn = "cliente"; storeFile = "my-store.keystore"; keyStorePass = "storepass"; caAlias = ""; // l'ho lasciato vuoto per comodità } public void creaKStore() { try { //Load del file my-ca.p12 //Test sull'esistenza del keystore if (new File(storeFile ). exists()) { //Se il keystore esiste effettuo il load System. out. println("Ho trovato keystore - file: " + storeFile ); ks.load(in, keyStorePass.toCharArray()); in.close(); try { // Estraggo il certificato relativo all'alias CA (aliasIN - vedi dopo) java. security. cert. Certificate cert = ks. getCertificate(aliasIn ); if (cert != null) { System. out. println("Trovato certificato di " + aliasIn + " nel keystore - file: " + storeFile ); } else { System. out. println("Non ho trovato certificato di " + aliasIn + " nel keystore - file: " + storeFile ); } } //catch (UnrecoverableKeyException e) { System.out.println(e.toString());} //catch (NoSuchAlgorithmException e) { System.out.println(e.toString()); } System. out. println(e. toString()); System. out. println(e. toString()); } } else { //Se il keystore non esiste creo un nuovo keystore System. out. println("Non ho trovato keystore - file: " + storeFile ); ks.load(null, null); try { // Get private key Key key = caKs. getKey(caAlias, caPassword. toCharArray()); // Get certificate of public key java. security. cert. Certificate cert = caKs. getCertificate(caAlias ); // Get public key // Return a key pair //inserisco il certificato di my-ca dal file .p12 nel keystore appena creato //con alias CA ks.setCertificateEntry(aliasIn, cert); } System. out. println(e. toString()); System. out. println(e. toString()); System. out. println(e. toString()); System. out. println(e. toString()); } //Salvo il keystore su file con password ks.store(out, keyStorePass.toCharArray()); out.close(); System. out. println("Creato keystore - file: " + storeFile ); JOptionPane. showMessageDialog(null, "KeyStore creato con successo", "Successo", JOptionPane. INFORMATION_MESSAGE); } System. out. println(e. toString()); } return; } }
|
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 |