Problema ao criar CertificateChains

Galera, estou começando a mexer com certificados no Java e não estou conseguindo criar um CertificateChain para meu certificado de teste.
O que eu tenho é o seguinte: meu certificado criado por um certificado(issuer B), que por sua vez é criado por um certificado(issuer A),ou seja, tenho uma cadeia com 3 certificados, certo?
Agora eu gostaria de montar essa cadeia para poder validar o meu certificado de teste, mas não estou conseguindo

Estou usando apenas o JCA do Java, sem nenhum outro Framework(Bouncy Castle ou CODEC[do projeto Semoa]).
E estou usando assim:

                        CertificateFactory cf = CertificateFactory.getInstance("X.509");
			FileInputStream fis = new FileInputStream(new File("D:" + File.separator + "TESTEX509.cert"));
			BufferedInputStream bis = new BufferedInputStream(fis);
			X509Certificate c = (X509Certificate) cf.generateCertificate(bis);

                        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
			FileInputStream fis2 = new  FileInputStream(System.getenv("APPDATA")+File.separator+"Sun"+File.separator+"Java"+File.separator+"Deployment"+File.separator+"security"+File.separator+"trusted.cacerts");
			BufferedInputStream bis2 = new BufferedInputStream(fis2);
                        ks.load(bis2,"".toCharArray());
                        //Um seletor de certificado informando que o subject é o issuer do MEU certificado lido.
			X509CertSelector xcs = new X509CertSelector();
			xcs.setSubject(x9.getIssuerX500Principal().getEncoded());
			PKIXBuilderParameters pkbp = new PKIXBuilderParameters(ks,xcs);
			CertPathBuilder cpb1 = CertPathBuilder.getInstance("PKIX");
			CertPathBuilderResult cpbr1 = cpb1.build(pkbp);
			CertPath cp1 = cpbr1.getCertPath();

Alguém dá alguma luz??? Se eu puxo a lista ta lá direitinho, Cert A: Subject: José, Issuer: José. Cert B: Subject: Pedro, Issuer: José.
o Cert A seria a CA e o cert B um intermediário. Tá difícil isso meu =/

Obs: Eu importei todos os certificados que estão fazendo a cadeia dentro do trusted.certs pelo Painel de controle do Java(Painel de Controle -> Java), ou seja, todos os certificados estão lá. Mas não sei porque o certPath cp1 vem com length zero. Não traz nada =(

Qual o objetivo de desenvolver este código? É só para entender como mexer com certificados ou é para algum projeto?

Acho que você quer fazer isto:
http://java.sun.com/javase/6/docs/technotes/guides/security/certpath/CertPathProgGuide.html

Não entendi direito a sua cadeia de certificados. Ela já está gerada? (CertA assinado por CertB assinado pro CertC)
ou voce só tem CertA, CertB e CertC e quer assinar CertA com a chave privada de CertB e assinar CertB com a chave privada de CertC. Se a cadeia já estiver gerada é só importar. Agora se for assinar, e puder usar código externo, recomendo usar o OpenSSL.

Estou fazendo para entender mesmo como usa certificado.Já existe a cadeia. Meu certificado(Cert A) está assinado por uma entidade intermediária(Cert B) que por sua vez assinada por uma CA(Cert C).
Todos os certificados são de teste, e já importei todos pelo Java Control Panel. Já li esse CertPathGuide todo e estava tentando implementar o que está descrito na primeira figura da cadeia de certificados, porém, mesmo eu tendo todos os certificados lá carregados, quando tento montar a cadeia deles sempre me traz o path com length zero, ou seja, não criou a cadeia corretamente.

Todos os certificados estão no formato X509, porém quando tento usar o X509CertSelector (xcs) passando xcs.setSubject(x9.getIssuerX500Principal()), onde o x9 é o objeto do meu certificado, ele não me retorna nada. Nessa chama eu quero que ele pesquise dentro do meu keystore o certificado onde o subject é o issuer(seria o Cert B) do meu certificado(Cert A). Não sei se estou sendo claro…

PS: Estou querendo fazer a validação completa dos certificados, dentro de cada um entrar na CRL indicada e verificar se o certificado foi revogado ou não, verificar a validade deles…enfim, o pacote de validação todo.

Estou meio sem tempo para ficar olhando código, mas pelo o que eu entendi, não seria isto que você quer fazer?
http://www.exampledepot.com/egs/java.security.cert/ValidCertPath.html

Não cara, o meu problema é justamente o criar o ‘certPath’ que está em azul nessa página que você enviou. E nesse link logo acima dele no comentário ele já tem todos os certificados em um array, e eu quero criar justamente eles a partir de um keyStore local meu passando como base o issuer do meu certificado.

Ex meu cert:
Subject: Lao
Issuer: Serasa ( ou qq coisa assim)

Tá fogo isso…

oyama, você não tem nenhum exemplo de criação de cadeia de certificados a partir de um KeyStore??? Utilizando o objeto X509CertSelector ?? Eu não acho exemplo disso em lugar nenhum cara…

Eu nunca mexi com estas classes de CertSelector, CertPath, etc. No máximo, eu li uma keystore e busquei por um certificado (por alias, serial number, texto no DN). Já faz bastante tempo que eu mexi com isto e estou sem tempo para mexer em código para poder te dar um rumo. Se conseguir alguma coisa eu posto aqui.

Parece uqe não foi só você que nunca mexeu nisso. Tem mais eu e os outros programadores =p

Tenso…

CertPath e outras classes só apareceram no Java 1.4 e provavelmente ele teve de fazer algo para Java 1.3 ou anteriores, onde tais coisas não existiam. Eu mesmo não cheguei a usar CertPath.

Humm, mas então o que você usa para montar a cadeia dos certificados se não usa a CertPath? Porque se eu tenho um certificado e preciso validá-lo até a raiz preciso montar a cadeira e verificar as CRLs, as Assinaturas(fazendo a verificação com a Chave Pública do emissor) e verificando o KeyUsage dele. Existe alguma outra maneira de se fazer isso? Eu estou olhando agora o framework do BouncyCastle para ver se existe algo que me ajude, porque pela JCA não consegui fazer o que estou querendo.

Alguma dica?

Pois é, tive de fazer no braço, porque nessa época o BouncyCastle até aceitava esse tipo de validação, mas via CertPath mesmo (o que eu não podia usar na época por causa do Java 1.3)

Porque cara, como esse esquema com o JCA não está funcionando e não sei quanto tempo vou demorar pra entender a API do BouncyCastle acho que vou fazer na mão, como você fez. Eu vou pegando de certificado em certificado verifico a assinatura pra ver se ele é realmente o emissor e vou montando a cadeia, porque dessas outras maneiras ‘mais fáceis’ não está funcionando ¬¬.

Você não teria algum código do bouncy castle fazendo isso que estou querendo? Montando a Chain de um KeyStore meu sabendo o Issuer de um certificado??

Valeu denovo…