Usando o netbeans, criei um projeto baseando-se em uma URL que aponta para um WSDL. Por se tratar de uma aplicação segura, alguns certificados foram mostrados na tela do NetBeans durante a criação e eu os aceitei, concluí o projeto e o WebService está funcionando perfeitamente em minha máquina.
Preciso coloca-lo em produção e para isso o projeto foi incluído em um servidor LINUX com o TomCat 5.5. Quando tento consumir o serviço, o seguinte erro é emitido:
Alguém já passou por isso? Faz ideia do que se trata ? Imagina ou sonha o que pode ser ? rs
Muito obrigado pela contribuição de todos.
ou o certificado não foi colocado corretamente no seu keystore.
Você precisa desses dois configurados corretamente pra consumir o serviço.
Abraço.
L
lblanco
Pois é,
Hoje a tarde fiz mais alguns testes e descobri que as vezes ele funciona, outras vezes não.
Para evitar este problema pensei em instalar o certificado no servidor, porém não tenho o arquivo do certifado, então acessando o internet explorer eu exportei-o.
Agora tenho um arquivo .cer, porém não tenho a senha.
Como posso fazer ?
A
altitdb
Se não me engano, acho que você consegue importar o arquivo .cer pro keystore sem ter a senha.
xD~~
L
lblanco
Olá,
Nada feito. Ele pede a senha e o usuário. Sem estas informações não é possível acessar o serviço.
Que coisa não !
A
altitdb
Tente criar outro e importar pro keystore.
xD~~
M
marcos1EM
altitdb, tive um problema semelhante e tive que fazer como está descrito no link abaixo:
usar a gambiarra do linkl acima eh a mesma coisa que nao usar SSL
faca o que foi sugerido acima, crie um novo SSC e instale o mesmo que vai funcionar
L
lblanco
Olá,
O que é SSC ?
Para importar o certificado na máquina linux é preciso do usuário e da senha do certificado. Já entrei em contato com a empresa fornecedora do serviço e estou aguardando o que eles vão me falar.
Quando conseguir algo publico aqui a solução encontrada.
Obrigado.
B
balrog
SSC = self signed certificate
agora se vc tem um certificado assinado por uma CA oficial, e nao sabe a senha ? ninguem merece neh…
Eu acessei o link onde o serviço deve ser consumido. Exportei o certificado (.cer) para o meu computador e segui os passos para importa-lo no servidor usando o keytool, mas infelizmente o usuário e a senha são solicitados.
Andei pesquisando sobre o assunto e vi que a forma correta para se fazer isto é exatamente como descrevi acima, porém para isso preciso do usuário e da senha o certificado. Como já mencionei, já entrei em contato com a empresa que fornece o serviço e agora estou aguardando um retorno.
Não tenho muito o que fazer e desabilitar o certificado ( como o link acima ) não acho muito prudente, visto que se trata de informações confidenciais.
Muito obrigado para todos.
Assim que conseguir solicitar o problema, postarei aqui um passo-a-passo para a minha solução.
Muito obrigado.
L
lblanco
Ola,
Com a senha em mãos executei o seguinte comando no servidor:
E o webservice funcionou.
Muito obrigado a todos pelos posts.
Caso alguém tenha dúvidas, é só me procurar.
Será um prazer ajuda-los.
Obrigado.
L
lblanco
Galera,
Achei que havia conseguido fazer o trem funcionar, mas pelo visto nada. Estou ficando aborrecido com isto já. Estou apanhando muito para fazer o meu webservice client falar com um serviço que tem HTTPS.
O que eu já fiz foi:
1 - Exportei o certificado .cer usando o internet explorer.
2 - No servidor linux usei o seguinte comando para importar o bendito do certificado:
3 - no meu código, inclui o seguinte trecho de código
System.setProperty("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol");Security.addProvider(newcom.sun.net.ssl.internal.ssl.Provider());System.setProperty("javax.net.ssl.trustStoreType","JKS");System.setProperty("javax.net.ssl.trustStore","caminhodocertificado");System.setProperty("javax.net.ssl.keyStorePassword","12345"); -- senha que coloquei na importacao do certificado.
4 - O erro que recebo é este:
Preciso de ajuda.
Não tenho mais forças para prosseguir sozinho rs.
Abraços e confiante que alguma alma caridosa e fuçada irá me ajudar rs
Obrigado.
A
altitdb
Amigo,
você informou apenas os valores do certificado.
Pra consumir você precisa informar os valores do keystore também.
Não desanime não, Web Services com HTTPS são dificeis mesmo.
Mais com o tempo você pega a moral…
xD~~
L
lblanco
Pois é,
É nisto que eu estou apanhando. O que vem a ser o keystore ? Tenho um certificado .cer, então pensei que ao importa-lo com o comando acima ele já estaria em meu repositório de certificados. Você consegue me ajudar ? Preciso terminar este trabalho que já está me tomando mais tempo do que havia planejado.
Os passos que fiz acima estão corretos ? Falta apenas apontar o meu keystore ? Como posso fazer isso ?
Muito obrigado mesmo.
A
altitdb
Essa classe aqui vai te ajudar, basta você configurar com sua URL e porta, dai ela vai te gerar um arquivo cacerts (falei errado, não é keystore) pra você informar quando for consumir o serviço.
Eu ainda to quebrando a cabeça com alguns pontos de consumo. Algumas palavras parecidas e ainda to sem muito conceito!
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packagenfe20;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.InputStream;importjava.io.OutputStream;importjava.security.KeyStore;importjava.security.MessageDigest;importjava.security.cert.CertificateException;importjava.security.cert.X509Certificate;importjavax.net.ssl.SSLContext;importjavax.net.ssl.SSLException;importjavax.net.ssl.SSLHandshakeException;importjavax.net.ssl.SSLSocket;importjavax.net.ssl.SSLSocketFactory;importjavax.net.ssl.TrustManager;importjavax.net.ssl.TrustManagerFactory;importjavax.net.ssl.X509TrustManager;/** * * @author altitdb */publicclassNFeBuildAllCacerts{privatestaticfinalStringJSSECACERTS="nfe-cacerts";privatestaticfinalintTIMEOUT_WS=60;publicstaticvoidmain(String[]args){try{/** * Endereço do WebService. * O Endereço abaixo é do Sefaz Virtual RS, altere para o endereço que * for necessário. */// String enderecoWebService = "homologacao.nfe2.fazenda.pr.gov.br";StringenderecoWebService="localhost";// File cacertsFile = gerarCacerts(enderecoWebService, 443);FilecacertsFile=gerarCacerts(enderecoWebService,8443);if(cacertsFile!=null){info("| Cacerts gerado em: "+cacertsFile.getAbsolutePath());}}catch(Exceptione){error(e.toString());}}publicstaticFilegerarCacerts(Stringhost,intport)throwsException{char[]passphrase="changeit".toCharArray();Filefile=newFile(JSSECACERTS);if(file.isFile()==false){charSEP=File.separatorChar;Filedir=newFile(System.getProperty("java.home")+SEP+"lib"+SEP+"security");file=newFile(dir,JSSECACERTS);if(file.isFile()==false){file=newFile(dir,"cacerts");}}info("| Loading KeyStore "+file+"...");InputStreamin=newFileInputStream(file);KeyStoreks=KeyStore.getInstance(KeyStore.getDefaultType());ks.load(in,passphrase);in.close();SSLContextcontext=SSLContext.getInstance("TLS");TrustManagerFactorytmf=TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());tmf.init(ks);X509TrustManagerdefaultTrustManager=(X509TrustManager)tmf.getTrustManagers()[0];SavingTrustManagertm=newSavingTrustManager(defaultTrustManager);context.init(null,newTrustManager[]{tm},null);SSLSocketFactoryfactory=context.getSocketFactory();info("| Opening connection to "+host+":"+port+"...");SSLSocketsocket=(SSLSocket)factory.createSocket(host,port);socket.setSoTimeout(TIMEOUT_WS*1000);try{info("| Starting SSL handshake...");socket.startHandshake();socket.close();info("| No errors, certificate is already trusted");}catch(SSLHandshakeExceptione){/** * PKIX path building failed: * sun.security.provider.certpath.SunCertPathBuilderException: * unable to find valid certification path to requested target * Não tratado, pois sempre ocorre essa exceção quando o cacerts * nao esta gerado. */}catch(SSLExceptione){error("| "+e.toString());}X509Certificate[]chain=tm.chain;if(chain==null){info("| Could not obtain server certificate chain");returnnull;}info("| Server sent "+chain.length+" certificate(s):");MessageDigestsha1=MessageDigest.getInstance("SHA1");MessageDigestmd5=MessageDigest.getInstance("MD5");for(inti=0;i<chain.length;i++){X509Certificatecert=chain[i];sha1.update(cert.getEncoded());md5.update(cert.getEncoded());Stringalias=host+"-"+(i);ks.setCertificateEntry(alias,cert);info("| Added certificate to keystore '"+JSSECACERTS+"' using alias '"+alias+"'");}Filecafile=newFile(JSSECACERTS);OutputStreamout=newFileOutputStream(cafile);ks.store(out,passphrase);out.close();returncafile;}privatestaticclassSavingTrustManagerimplementsX509TrustManager{privatefinalX509TrustManagertm;privateX509Certificate[]chain;SavingTrustManager(X509TrustManagertm){this.tm=tm;}publicX509Certificate[]getAcceptedIssuers(){thrownewUnsupportedOperationException();}publicvoidcheckClientTrusted(X509Certificate[]chain,StringauthType)throwsCertificateException{thrownewUnsupportedOperationException();}publicvoidcheckServerTrusted(X509Certificate[]chain,StringauthType)throwsCertificateException{this.chain=chain;tm.checkServerTrusted(chain,authType);}}privatestaticvoidinfo(Stringinfo){System.out.println("INFO: "+info);}privatestaticvoiderror(Stringerror){System.out.println("ERROR: "+error);}}
É pra chorar rs.
Olhem a hora rs… estou aqui correndo atrás desse negocio.
Chutei o pau da barraca e tentei desativar a validação e mesmo assim o erro é este:
altitdb, não é possivel converter o .cer para pfx
Quanto as suas classes, muito obrigado mesmo. Como posso fazer para usa-las ?
Vejo que você tem duas. Em que momento devo instancia-las ?
Estou chegando ao ponto de desistir !
A
altitdb
É possivel sim, tem um programa que utilizo chamado KeyStore Explorer 4.0.1, ele faz esse serviço^^
Show de bola ele…
Essas classes você executa elas “avulsas” na verdade é só uma, dai ele te gera o arquivo!!
Você precisa gerar ele apenas uma vez.
xD~~
B
balrog
com openssl vc consegue fazer essa conversao
L
lblanco
Isto podia ser um pouco mais simples, ou pelo menos ter um pouco mais de material.
Vou ver se compro um livro para entender melhor sobre isso e então depois partir para o trabalho. Assim, na tentativa e erro é complicado. Acabo me irritando.
Veja o link que encontrei. Tem coisas aqui também:
estava com a impressao de que vc javia resolvido o problema uma vez com a senha em maos, qual eh exatamente a dificuldade que vc esta tendo no momento? eh apenas o cliente que nao esta autenticando corretamente?
L
lblanco
Pois é,
Eu também achei que já tinha resolvido, mas não. Sinceramente, nem sei mais o que dizer. Fiz tudo o que precisava ser feito, importei o certificado usando o keytool, setei para não validar certificado, usei as dicas do blog acima e nada. Sempre recebo os mesmos erros. Ora o certificado não foi encontrado, ora o certificado não é valido e ora a url esta errada. Diante disso não sei mais o que fazer.
Lembrando que localmente , no meu computador a aplicação funciona sem problemas. Quando jogo ela no servidor tenho essas dificuldades.
Vou procurar algum livro na net falando sobre isso , não adianta ficar chutando para achar as soluções. Vou estudar primeiro sobre o assunto que a solução vem.
Se alguém estiver afim de dar uma aula, estou a aberto a aprender rs.
Meu skype é lucasblancob
Abraçosss
L
lblanco
Opa,
Respondendo a sua pergunta, o erro que estou empacado agora é:
B
balrog
esse erro eh relacionado ao fato da URL do seu servidor ser diferente da URL que o certificado foi emitido, o que normal quando vc esta usando um SSC (imagino que este seja seu caso)
ae que vem o lance de vc instruir a JRE que o seu certificado eh valido, e os erros de dominios incompativeis deveriam desaparecer
qual servidor vc usa? qual setup vc esta usando no conector?
L
lblanco
Eu utilizo o um servidor LINUX com a distribuição SUSE.
Estou utilizando o TomCat 5.5 e utilizo o conector padrão do TomCat, se eu não me engano é o OpenSSL !
Foi isto que me perguntou rs ?
B
balrog
sim, isso mesmo poste a configuracao do conector:
L
lblanco
No tomcat eu não fiz absolutamente nada.
Apenas acessei o servidor, usei o comando do Keytool para importar o certificado e em seguida usei o código abaixo para configurar a minha aplicação
para acessar o keystore gerado
caso queira forcar o uso de client certs, apenas mude para clientAuth="true"
B
balrog
isso eh verdade, querer correr antes de saber caminhar nunca da muito certo
esse post explica o basico do basico que vc tem que entender (ele fala sobre o setup no weblogic weblogic, mas a mecanismo eh identico em qualquer servidor)
Eu não alterei o tomcat porque recebi instruções que uma vez que o código fosse colocado no meu programa, não seria necessário alterar as configurações.
De qualquer forma obrigado pela ajuda.
Vou estudar o assunto antes para não ficar falando besteira rs.
Obrigado.
D
DANTONIO
Alguém pode me ajudar?
Estou tentando fazer funcionar um webservice acessar um https, eu estava fazendo com System.properties na aplicação, passando como parametro os certificados.
Quando migramos para o Weblogic isso parou de funcionar.
Esse weblogic, tem alguma mágica pra fazer ele respeitar o System.properties da minha aplicação?