OpenOces

15 respostas
R

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??

15 Respostas

T

Procure pela documentação de java.security.cert.X509Certificate (método org.openoces.ooapi.cert.OcesCertificate.getEncapsulatedCertificate

R

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

T

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.

R

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??

T

Procure por CertPath, CertPathBuilder, TrustAnchor, CertPathValidator ( http://java.sun.com/javase/6/docs/api/java/security/cert/package-summary.html )

R

Vlw thingol, vou me dar uma pesquisada nessas classes.

R

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]

T

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.

R

thingol:
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

R

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.

trgpwild

rtsugumi como vc conseguiu resolver a exception?

R

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.

trgpwild

Se você puder, por favor posta o pedaço do código que vc usou para capturar o X509Certificate, Abraço…

R
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;
}
trgpwild

Cara muito obrigado… Vlwssss… Abraço

Criado 6 de janeiro de 2009
Ultima resposta 27 de mai. de 2009
Respostas 15
Participantes 3