package org.ourgrid.common.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.security.PrivateKey; import java.security.cert.X509Certificate; import java.security.spec.InvalidKeySpecException; import java.util.Properties; import org.apache.commons.io.FileUtils; import org.bouncycastle.jce.provider.X509CertParser; import org.bouncycastle.x509.X509V3CertificateGenerator; import org.bouncycastle.x509.util.StreamParsingException; import br.edu.ufcg.lsd.commune.network.certification.providers.FileCertificationProperties; import br.edu.ufcg.lsd.commune.network.signature.SignatureProperties; import br.edu.ufcg.lsd.commune.network.signature.Util; public class IssuedCertificateGenerator { private static final String WRONG_ARGS = "Wrong number of arguments! " + "Usage: IssuedCertificateGenerator certificatePath" + " propertiesFilePath outPutCertificatePath"; public static void main(String[] args) throws Exception { if (args.length != 3) { throw new IllegalArgumentException( WRONG_ARGS); } issueCertificate(args[0], args[1], args[2]); } public static void issueCertificate(String certificatePath, String propertiesFilePath, String outPutCertificatePath) throws Exception { Properties issuerProperties = loadProperties(propertiesFilePath); PrivateKey issuerPrivateKey = loadIssuerPrivateKey(issuerProperties); X509Certificate issuerCertificate = loadIssuerCertificate(issuerProperties); X509Certificate certificate = loadCertificate(certificatePath); X509V3CertificateGenerator certGenerator = new X509V3CertificateGenerator(); certGenerator.setSerialNumber(certificate.getSerialNumber()); certGenerator.setPublicKey(certificate.getPublicKey()); certGenerator.setSubjectDN(certificate.getSubjectX500Principal()); certGenerator.setIssuerDN(issuerCertificate.getSubjectX500Principal()); certGenerator.setNotBefore(certificate.getNotBefore()); certGenerator.setNotAfter(certificate.getNotAfter()); certGenerator.setSignatureAlgorithm(certificate.getSigAlgName()); X509Certificate signedCertificate = certGenerator.generate(issuerPrivateKey); File file = new File(outPutCertificatePath); if (!file.exists()) { FileUtils.touch(file); } FileOutputStream fosP = new FileOutputStream(file); fosP.write(signedCertificate.getEncoded()); fosP.close(); } private static X509Certificate loadCertificate(String certificatePath) throws FileNotFoundException, StreamParsingException { X509CertParser certificateParser = new X509CertParser(); certificateParser.engineInit(new FileInputStream(certificatePath)); X509Certificate certificate = (X509Certificate) certificateParser.engineRead(); return certificate; } private static X509Certificate loadIssuerCertificate(Properties issuerProperties) throws IOException, FileNotFoundException, StreamParsingException { String issuerCertificatePath = issuerProperties.getProperty( FileCertificationProperties.PROP_MYCERTIFICATE_FILEPATH); X509Certificate issuerCertificate = loadCertificate(issuerCertificatePath); return issuerCertificate; } private static PrivateKey loadIssuerPrivateKey(Properties issuerProperties) throws InvalidKeySpecException { PrivateKey privateKey = Util.decodePrivateKey(issuerProperties.getProperty( SignatureProperties.PROP_PRIVATE_KEY)); return privateKey; } private static Properties loadProperties(String propertiesFilePath) throws IOException, FileNotFoundException { Properties issuerProperties = new Properties(); issuerProperties.load(new FileInputStream(propertiesFilePath)); return issuerProperties; } }