Problemas ao capturar extensões subject alternative names de certificados X509
7 respostas
A
Arturo
Bom dia pessoal,
Estou tentando recuperar os assuntos alternativos de um certificado X509 mas estou tendo um problema.
Pelo metodo “getSubjectAlternativeNames()” consigo pegar uma coleção que por sua vez é formada de outras coleções. Essas “sub-coleções” contém dois itens o primeiro item é um Integer e o segundo uma String ou um array de bytes. Quando for uma String eu sei que se trata da extensão NomeRFC822 mas quando vem um array de bytes sei que vem codificado no padrão “ASN.1 Octet String”, é aqui que começa o problema, pq não consigo identificar seu OID.
Estou usando a DEROctetString da API da BouncyCastle, mas apartir dessa clase não consigo capturar o oid.
como posso identificar o OID de uma extenção apartir de seu valor?
É mais complicado que parece. Aqui vai um pedaço de código, veja se ajuda.
/** * Uma classe que encapsula pares de objetos. * Inspirado no template pair<> da STL. * * @param <T> O primeiro tipo. * @param <U> O segundo tipo. */classPair<T,U>{/** O primeiro objeto. */publicTfirst;/** O segundo objeto. */publicUsecond;/** Construtor */publicPair(Tt,Uu){first=t;second=u;}}/** * Interpreta um dado do tipo otherName. * Obs. O JDK 5.0 não tem classes que lidem com um dado do tipo OtherName. * É necessário usar o BouncyCastle. * @param encoded O dado em ASN.1. * @return Um par contendo o OID e o conteúdo. */privatePair<DERObjectIdentifier,String>getOtherName(byte[]encoded)throwsIOException{// O JDK 5.0 não tem classes que lidem com um dado do tipo OtherName.// É necessário usar o BouncyCastle.ASN1InputStreaminps=newASN1InputStream(encoded);DERSequenceseq=null;DERObjectIdentifieroid=null;Stringconteudo="";seq=(DERSequence)inps.readObject();inps.close();Enumerationen=seq.getObjects();oid=(DERObjectIdentifier)en.nextElement();DERObjectobj=((ASN1TaggedObject)((ASN1TaggedObject)en.nextElement()).getObject()).getObject();if(objinstanceofDERString){// Certificados antigos SERASA - incorretosconteudo=((DERString)obj).getString();}elseif(objinstanceofDEROctetString){// Certificados corretosconteudo=newString(((DEROctetString)obj).getOctets(),"ISO-8859-1");}returnnewPair<DERObjectIdentifier,String>(oid,conteudo);}//for(List<?>subjectAlternativeName:cert.getSubjectAlternativeNames()){Stringemail;Pair<DERObjectIdentifier,String>otherName;intpos;// O primeiro elemento é um Integer com o valor 0 = otherName, 1 = rfc822name etc.// O segundo valor é um byte array ou uma String. Veja o javadoc de// getSubjectAlternativeNames.switch(((Number)subjectAlternativeName.get(0)).intValue()){case0:// OtherName - contém CPF, CNPJ etc.otherName=getOtherName((byte[])subjectAlternativeName.get(1));// o OID fica em otherName.first break;case1:// rfc822Name - usado para emailemail=(String)subjectAlternativeName.get(1);props.put("email",email);break;default:break;}}
Abdon
Esta api que vcs estão utilizando para fazer este decode fazem decode de arquivos BER?
Eu tive que fazer isso um tempo atraz e não achei nada em java, somente C++.
T
thingol
Mais ou menos. Para o uso com certificação digital é suficiente.
Danilo_Marchiori
thingol,
essa solução que você apresentou é exatamente para o meu problema, porém usando uma biblioteca diferente da que eu uso. Você usa a BouncyCastle e estou usando a api da Sun, a WSDP…
Você conhece a mesma solução porém usando essa outra biblioteca…?
valeu
T
thingol
Olha, eu simplesmente nunca mexi com a parte de segurança da WSDP.
(É que sou meio folgado e acostumado com a BouncyCastle.)
Não sei se a parte de segurança da WSDP tem uma parte ASN.1 disponível para ser usada. (Eu sei que há uma porção de classes “com.sun.*” que fazem exatamente essa parte de parsing ASN.1, mas não quero fazer meus programas dependerem de uma API que talvez não possa instalar (por exemplo, digamos que eu vá usar o WebSphere em vez de usar o JBoss ou o Sun Java System Application Server).
Danilo_Marchiori
Você pode me dar sua opnião sobre o BouncyCastle? É que eu ainda posso largar o WSDP e manipular os certificados usando o BouncyCastle, mas essa API tem q ser fácil de mexer e rápido de desenvelver.
É facil mexer com certificados X509? Assinar arquivos XML? Checar assinaturas de XMLs? Etc…
valeu
T
thingol
A parte de XML-Signature e XML-Encryption, se não me engano, não está implementada no BouncyCastle.
Eu se fosse você iria usar as 2 bibliotecas, a menos que você tivesse um problema com deployment. Por exemplo, o BouncyCastle é um JCE Provider, e isso pode dar problemas em alguns ambientes onde você não pode mexer no diretório jre/lib/ext (onde esse arquivo deve ser copiado), ou no arquivo jre/lib/security/java.security (onde o BouncyCastle deve ser configurado).