API Bouncy Castle Não funciona

Estou com um projeto de TCC onde terei que implementar certificação digital e vi que a API Bouncy Castle é uma API bem completa para a implementação, porém estava tentando fazer testes antes de usa-la e é ai que começa os meus problemas.

Baixei o .jar no site do BC e importei o mesmo no buld path para poder usar a API mas quando eu tento implementar a classe

X509V1CertificateGenerator ele da o seguinte erro:

org.bouncycastle.x509.X509V1CertificateGenerator

Note: This element has no attached source and the Javadoc could not be found in the attached Javadoc.

Já tentei de tudo e não consigo resolver. Preciso de uma solução o mais breve possível por favor.

import java.math.BigInteger;
import java.security.*;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import java.util.Date;
import javax.security.auth.x500.X500Principal;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.x509.X509V1CertificateGenerator;

public class Teste {
	
	public Teste()
	{
		Security.addProvider(new BouncyCastleProvider());
	} 
	 @SuppressWarnings("deprecation")
	public static X509Certificate generateV1Certificate(KeyPair pair) throws InvalidKeyException, NoSuchProviderException, SecurityException, SignatureException, CertificateEncodingException, IllegalStateException, NoSuchAlgorithmException
	 {
		 X509V1CertificateGenerator certGen = new X509V1CertificateGenerator();
			
		 	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");
	        
	        return certGen.generate(pair.getPrivate(), "BC");		 
	 }
	
	public KeyPair generateKeys() throws Exception 
	{
        KeyPairGenerator keyGenerator = KeyPairGenerator.getInstance("RSA", "BC");//Algorítimo RSA e provedor BC
        keyGenerator.initialize(1024, new SecureRandom());
        return keyGenerator.generateKeyPair();
	}	
}

Mas onde o erro é apresentado?

Você precisa instalar o BouncyCastle Provider. Ele não funciona só pondo os jars no seu classpath, a menos que na sua aplicação você adicione explicitamente o BouncyCastle como JCE Provider.

http://www.mobilefish.com/developer/bouncycastle/bouncycastle_quickguide_install.html

O erro ocorre em

 X509V1CertificateGenerator certGen = new X509V1CertificateGenerator();

e se da o seqguinte:

The type X509V1CertificateGenerator is deprecated. Ai quando eu coloco Add @supress warning aparece um risco em cima do X509V1CertificateGenerator e ai a mensagem: Note: This element has no attached source and the Javadoc could not be found in the attached Javadoc.

Ele é “deprecated” porque não se usam mais certificados da versão V1, só da versão V3. (Basicamente, porque certificados da versão 1 não suportam os algoritmos mais modernos e acabam sendo intrinsecamente mais inseguros).
Use uma outra coisa.

Para aprender a usar direitinho o BouncyCastle, tente achar o livro “Beginning Cryptography with Java” do sr. David Hook. (Esse livro é um pouco antigo, mas acho que alguém deve tê-lo escaneado. De qualquer forma, os fontes dos exemplos estão disponíveis no site da editora:

http://www.wrox.com/WileyCDA/WroxTitle/Beginning-Cryptography-with-Java.productCd-0764596330,descCd-DOWNLOAD.html

Estou fazendo a instalação a partir do site http://www.mobilefish.com/developer/bouncycastle/bouncycastle_quickguide_install.html . O tutorial esta falando da versão jre 1.4 e o arquivo a ser copiado seria o bcprov-jdk14-128.jar.

Uso a jre7 mas o bc apenas tem o arquivo bcprov-jdk16-146.jar que seria para a jre6 correto? Como eu faria essa instalação para a jre7 ou não funciona? Sou iniciante nesta parte, me corrijam se estou falando besteira.

A minha instalação ficou assim:

C:\Tools\java\jdk1.7.0\jre\lib\ext\bcprov-jdk16-146.jar
C:\Program Files\Java\jre71\lib\ext\bcprov-jdk16-146.jar

Os arquivos security que o tutorial menciona eu não encontro, apenas copiei os arquivos .jar nos locais mencionados. Preciso editar o arquivo .jar?

C:\Tools\java\j2sdk1.4.2_01\jre\lib\security (J2SE SDK location)
C:\Program Files\Java\j2re1.4.2_01\lib\security (J2SE runtime location)

Se não me engano, há jars diferentes para cada versão do Java porque eles precisam ser assinados digitalmente pela Oracle (antigamente Sun), ou então por um certificado fornecido aos desenvolvedores do BouncyCastle pela Oracle.
Então se não houver um jar para a versão 7.0 (conferi e não achei mesmo) é melhor você pegar seu programa e passá-lo para Java 6.0 mesmo; você não deveria ter muitos problemas.

E como seria isso? Apenas desinstala a versão 7 e coloca a versão 6?

Eu não ponho meu java.exe no path, eu costumo ter várias versões do Java instaladas na mesma máquina, e para chamar o Java que eu quero, uso um script (batch).

Uai, o arquivo java.security está em c:\program files\java\jre7\lib\security (no caso do Java 6) ou em c:\program files\java\jre6\lib\security (no caso do Java 6) - você não achou?

E você pode me falar como eu faria isso? ainda sou iniciante nesta parte mais aprofundada de desenvolvimento…estou disposto a aprender.

[quote=entanglement]Uai, o arquivo java.security está em c:\program files\java\jre7\lib\security (no caso do Java 6) ou em c:\program files\java\jre6\lib\security (no caso do Java 6) - você não achou?

[/quote]

Opa sem querer, esse c:\program files\java\jre7\lib\security eu achei, não achei o C:\Tools\java\j2sdk1.4.2_01\jre\lib\security (J2SE SDK location).

Desculpe.

Um exemplo de erro que apareceu agora foi:

Description Resource Path Location Type
Access restriction: The constructor ASN1EncodableVector() is not accessible due to restriction on required library C:\Arquivos de programas\Java\jre7\lib\ext\bouncycastle.jar MyStructure.java /Exemplo/src/chapter5 line 98 Java Problem

Procurei em outros foruns e não achei nada que ajude.

Com os Exemplos do Livro Beginning Cryptography with Java, quando vou testar os exemplos que o autor pede, há muitos erros nas classes e os mesmos não rodam de jeito nenhum. Estou com o crypto-146 instalado junto com o jre6 e o jdk1.6.0_30. Esta tudo importado em build patch. É normal isso ocorrer?

[quote=entanglement]Ele é “deprecated” porque não se usam mais certificados da versão V1, só da versão V3. (Basicamente, porque certificados da versão 1 não suportam os algoritmos mais modernos e acabam sendo intrinsecamente mais inseguros).
Use uma outra coisa.

Para aprender a usar direitinho o BouncyCastle, tente achar o livro “Beginning Cryptography with Java” do sr. David Hook. (Esse livro é um pouco antigo, mas acho que alguém deve tê-lo escaneado. De qualquer forma, os fontes dos exemplos estão disponíveis no site da editora:

http://www.wrox.com/WileyCDA/WroxTitle/Beginning-Cryptography-with-Java.productCd-0764596330,descCd-DOWNLOAD.html
[/quote]

Mesmo eu usando a classe X509V3CertificateGenerator que seria um certificado V3 ainda da o mesmo deprecated.

Dúvida resolvida, obrigado a todos!

amigos estou precisando de ajuda com Bouncy Castle, preciso desenvolver um sistema para assinar digitalmente e depois validar com bouncy castle
Obrigado.

E qual é a ajuda? Onde você está tendo dificuldades?

então estou começando no assunto, estou um pouco perdido,

preciso gerar os arquivo p7s e o usar bouncy castle para validar, acho que deve ser isso

links, ou códigos para exemplo, por onde devo começar ?

Obrigado;

Comece por aqui.

obrigado, ajudou muito.
:slight_smile: