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 =(
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.
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)
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.
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.
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??