Pessoal é a primeira vez que eu estou trabalhando com certificação digital, nós estamos usando o openoces, já consegui gerar o certificado, eu queria saber se alguém sabe qual a classe que eu uso para extrair as informações do certificado??
OpenOces
15 Respostas
Procure pela documentação de java.security.cert.X509Certificate (método org.openoces.ooapi.cert.OcesCertificate.getEncapsulatedCertificate
vlw thingol, mas eu não consegui fazer funcionar ainda, eu coloco um etoken ai eu faço o login e gera um xml com os dados o certificado depois eu chamo esse código
CertificateFactory factory = CertificateFactory.getInstance("X.509");
X509Certificate certi = (X509Certificate)factory.generateCertificate(cert);
e dá o seguinte erro
Uma coisa que é absolutamente indispensável para quem está usando certificação digital é saber usar as seguintes ferramentas (que são em C mas devem ter versões compiladas para Linux e Windows, é só procurar):
dumpasn1 - ele permite ver se um arquivo está em formato DER e que dados ele tem;
openssl - por exemplo, openssl x509 -in arquivo.cer -certs permite listar os certificados contidos em um arquivo “arquivo.cer”.
Dá a impressão que você passou os dados errados para generateCertificate, que requer um array de bytes em formato DER.
Leia o livro “Beginning Cryptography in Java”, de David Hook, que explica como usar o BouncyCastle (biblioteca usada pelo OpenOCES) e os conceitos de criptografia que você precisa saber.
vlw thingol, eu consegui pegar as informações do certificado.
Agora eu preciso validar a cadeia de confiança do certificado, ai surgiu um dúvida eu preciso pegar os outros certificados da cadeia e trabalhar com a KeyStore??? é isso??
Procure por CertPath, CertPathBuilder, TrustAnchor, CertPathValidator ( http://java.sun.com/javase/6/docs/api/java/security/cert/package-summary.html )
Vlw thingol, vou me dar uma pesquisada nessas classes.
Blz eu consegui montar a cadeia de certificado, agora tem um monte de validações que eu preciso fazer mas o que eu to em dúvida são as seguinte:
[list]Validar o uso da chave utilizada (Assinatura Digital) de tal forma a aceitar
certificados somente do tipo A (não serão aceitos certificados do tipo S); (Existe alguma propriedade no certificado que informa se ele é do tipo a ou s ??)
[/list]
[list]Garantir que o certificado utilizado é de um usuário final e não de uma Autoridade
Certificadora; (É só verificar se no certificado contém um cnpj ou cpf, ou existe alguma verificação mais técnica??)
[/list]
Não sei como diferenciar certificados “A” e “S” só olhando em um X.509. Que eu saiba, “A” e “S” dizem se a chave privada está em disquete/hd/USB ou então em um smartcard.
Para o ICP-Brasil (Autoridade Certificadora Raiz Brasileira), o campo “Basic Constraints” indica que CA=TRUE; as autoridades certificadoras intermediárias (exemplo: ICP-Caixa, veja o certificado de https://internetcaixa.caixa.gov.br ) o campo BASIC CONSTRAINTS indica que CA=FALSE; e em um certificado de usuário esse campo também está preenchido com CA=FALSE. Veja se há mais algum campo no certificado ICP-Caixa (por exemplo) que possa ajudar a fazer tal distinção.
Não sei como diferenciar certificados “A” e “S” só olhando em um X.509. Que eu saiba, “A” e “S” dizem se a chave privada está em disquete/hd/USB ou então em um smartcard.Para o ICP-Brasil (Autoridade Certificadora Raiz Brasileira), o campo “Basic Constraints” indica que CA=TRUE; as autoridades certificadoras intermediárias (exemplo: ICP-Caixa, veja o certificado de https://internetcaixa.caixa.gov.br ) o campo BASIC CONSTRAINTS indica que CA=FALSE; e em um certificado de usuário esse campo também está preenchido com CA=FALSE. Veja se há mais algum campo no certificado ICP-Caixa (por exemplo) que possa ajudar a fazer tal distinção.
Vlw denovo thingol, sobre o certificado ser “A” ou “S” eu também não entendi direito eu copiei e colei as regras do manual da NF-E
Eu postei em um forum de criptografia e eles me responderam a dúvida se o certificado é do tipo “A” ou “S”.
O que muda no certificiado é a extensão keyUsage, se o bit digitalSignature tiver setado o certificado é do tipo “A”, se o bit keyEncipherment/dataEncipherment tiver setado o certificado é do tipo “S”
Eu não vou colocar o link do forum pq eu não sei se é permitido.
rtsugumi como vc conseguiu resolver a exception?
Consegui sim o problema era que eu estava tentando gerar o certificado com o xml inteiro, o correto é pegar somente a propriedade que representa o certificado.
Se você puder, por favor posta o pedaço do código que vc usou para capturar o X509Certificate, Abraço…
public X509Certificate getCertificate(Document doc) throws IOException, CertificateException {
// Pega do xml o valor codificado do certificado
NodeList nl = doc.getElementsByTagName("ds:X509Certificate");
if (nl == null || nl.getLength() == 0) {
nl = doc.getElementsByTagName("X509Certificate");
}
Node node = nl.item(0);
String encodedCertificate = node.getChildNodes().item(0).getNodeValue();
InputStream is = null;
X509Certificate certificate = null;
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
is = new ByteArrayInputStream(Base64.decode(encodedCertificate.trim().getBytes()));
certificate = (X509Certificate) certificateFactory.generateCertificate(is);
is.close();
return certificate;
}
Cara muito obrigado… Vlwssss… Abraço