Dúvidas Bouncy Castle

Galera estou com algumas dúvidas. Estou acompanhando o livro “Beginning Cryptography with Java”, estudando os seus exemplos e tals e me surgiu uma dúvida:

Quando eu crio um certificado com a seguinte classe:

package chapter6;

import java.math.BigInteger;
import java.security.*;
import java.security.cert.X509Certificate;
import java.util.Date;

import javax.security.auth.x500.X500Principal;

import org.bouncycastle.asn1.x509.BasicConstraints;
import org.bouncycastle.asn1.x509.ExtendedKeyUsage;
import org.bouncycastle.asn1.x509.GeneralName;
import org.bouncycastle.asn1.x509.GeneralNames;
import org.bouncycastle.asn1.x509.KeyPurposeId;
import org.bouncycastle.asn1.x509.KeyUsage;
import org.bouncycastle.asn1.x509.X509Extensions;
import org.bouncycastle.x509.X509V3CertificateGenerator;


/**
 * Basic X.509 V3 Certificate creation with TLS flagging.
 */
public class X509V3CreateExample
{
    public static X509Certificate generateV3Certificate(KeyPair pair)
        throws InvalidKeyException, NoSuchProviderException, SignatureException
    {
        // generate the certificate
        X509V3CertificateGenerator  certGen = new X509V3CertificateGenerator();

        certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));
        certGen.setIssuerDN(new X500Principal("CN=Test Certificate"));
        certGen.setNotBefore(new Date(System.currentTimeMillis() - 50000));
        certGen.setNotAfter(new Date(System.currentTimeMillis() + 50000));
        certGen.setSubjectDN(new X500Principal("CN=Test Certificate"));
        certGen.setPublicKey(pair.getPublic());
        certGen.setSignatureAlgorithm("SHA256WithRSAEncryption");
        
        certGen.addExtension(X509Extensions.BasicConstraints, true, new BasicConstraints(false));
        
        certGen.addExtension(X509Extensions.KeyUsage, true, new KeyUsage(KeyUsage.digitalSignature | KeyUsage.keyEncipherment));
        
        certGen.addExtension(X509Extensions.ExtendedKeyUsage, true, new ExtendedKeyUsage(KeyPurposeId.id_kp_serverAuth));
        
        certGen.addExtension(X509Extensions.SubjectAlternativeName, false, new GeneralNames(new GeneralName(GeneralName.rfc822Name, "test@test.test")));

        return certGen.generateX509Certificate(pair.getPrivate(), "BC");
    }
    
    public static void main(
        String[]    args)
        throws Exception
    {
        // create the keys
        KeyPair         pair = Utils.generateRSAKeyPair();
        
        // generate the certificate
        X509Certificate cert = generateV3Certificate(pair);

        // show some basic validation
        cert.checkValidity(new Date());

        cert.verify(cert.getPublicKey());

        System.out.println("valid certificate generated");
    }
}

Onde são guardados os certificados? Como vou usar em uma aplicação Web eu deveria ter o arquivo para poder importar no navegador correto? Dentre esta, ainda tenho muitas dúvidas sobre o uso de PKI’s e o provedor BC e postarei aqui para achar soluções.

Do jeito que está o código, ele só gerou na memória.

O keytool é uma ferramenta que vem junto com a instalação da JDK. Se você quer entender como se gera arquivo de certificados e chaves privadas, uma maneira é estudar o código deste aplicativo. Não sei onde eu olhei, mas se der uma googlada acho que você acha o fonte dele.

O keytool eu já usei e consegui fazer alguns certificados, colocar ele nas pastas que eu quero e tals, mas como estou em um projeto de TCC acho que usar a ferramenta de um provedor fica mais completo, também preciso fazer tipo uma PKI e não sei se é possivel fazer toda a gerencia dos certificados por ela.

public static void main(String[] args) throws Exception {
	
		String alias = JOptionPane.showInputDialog("Alias");
		String passwd = JOptionPane.showInputDialog("Senha");
		String cn = JOptionPane.showInputDialog("cn = Nome");
		String ou = JOptionPane.showInputDialog("ou = Unidade Organizacional");
		String o = JOptionPane.showInputDialog("o = Organização");
		String l = JOptionPane.showInputDialog("l = Localidade");
		String s = JOptionPane.showInputDialog("s = Estado(SP)");
		String c = JOptionPane.showInputDialog("c = País");
		int validade = Integer.parseInt(JOptionPane.showInputDialog("Validade das Chaves(Dias)"));
		
		File f = new File("exemplo.jks");	
		File path = new File("certificados");
		String caminho =  path.getAbsolutePath() + "\\keys\\";		
		StringBuilder command = new StringBuilder();
		command.append(System.getProperty("java.home")
		            + System.getProperty("file.separator") + "bin"
		            + System.getProperty("file.separator") + "keytool");
		command.append(" -genkey");		
		command.append(" -alias " + alias);
		command.append(" -keypass " + passwd);
		command.append(" -storepass " + passwd);
		command.append(" -keystore " + caminho + f);
		command.append(" -dname \"cn=" + cn + 
				", ou=" + ou + 
				", o=" + o + 
				", l=" + l + 
				", s=" + s + 
				", c=" + c + "\"");
		command.append(" -validity " + validade);
		final Process pr = Runtime.getRuntime().exec(command.toString());

		JOptionPane.showMessageDialog(null, "Caminho da Chave: " + caminho + f);
}

Usando o provedor BC como eu faria para salva-lo em arquivo?

Eu estou muito enferrujado nesta parte de programação. A dica que eu dou é: ver o código do keytool ou ver o código de uma implementação de PKI. Achei este :http://sourceforge.net/projects/ejbca/.

Rapaz estou vendo agora mesmo, muito obrigado pela dica, ainda terei dúvidas!..xD

Amigo eu não estou entendendo muito como usar essa implementação, fala que da para usar em windows mas apenas vejo codigos em linux e baixei o source. Li o tuto de instalação e não consegui fazer muita coisa. Alguem pode ajudar?

Desculpe, mas nunca instalei isto. Eu só conhecia de umas pesquisas que eu fiz para achar alguma PKI open source.