Bom dia pessoal
Preciso construir um web service que deverá acessar o INFOCONV (web service da Receita, pra consultar CPF/CNPJ). As questões legais já estão todas resolvidas pela minha empresa, e iniciamos a fase de desenvolvimento.
O cenário é basicamente o seguinte:
Existe hoje uma aplicação em Java, em produção, que emite alguns relatórios com relação aos eleitores de uma cidade. Há um novo caso de uso que torna necessário a consulta de CPFs na Receita. Porém, há um entrave que impede que façamos essa aplicação acessar diretamente o ws da Receita. Por isso, foi solicitada a construção de um web service para intermediar a conversa entre os dois.
Para testar a conexão com o WS da Receita tenho uma aplicação bem simples, feita por um outro desenvolvedor (terceirizado, que não está mais aqui - é sempre assim…) que acessa o web service da receita e efetua corretamente uma consulta por um CPF qualquer. No programa de teste é utlizado um cliente desktop (o básico, com um método main) que se comunica com o ws da Receita da seguinte forma:
URL wsdlURL = new URL("https://infoconv.receita.fazenda.gov.br/ws/cpf/ConsultarCPF.asmx?wsdl");
QName SERVICE_NAME = new QName("https://infoconv.receita.fazenda.gov.br/ws/cpf/", "ConsultarCPF");
Service wsService = Service.create(wsdlURL, SERVICE_NAME);
Para quem não conhece (como eu), o acesso ao INFOCONV requer o uso de certificado digital. Na aplicação de teste, a configuração do certificado é feita por meio de propriedades do sistema, assim:
...
System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
System.setProperty("javax.net.ssl.keyStore", keyStorePath);
System.setProperty("javax.net.ssl.keyStorePassword", "senha");
...
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStore", trustStorePath);
System.setProperty("javax.net.ssl.trustStorePassword", "senha");
...
Sendo:
keyStorePath: String com o caminho para o arquivo *.pfx
trustStorePath: String com o caminho para o arquivo *.jks
Ambos arquivos já estavam gerados quando o projeto caiu para mim. Segundo informações que me foram dadas, o arquivo *.pfx é um certificado e-Equipamento obtido junto ao SERPRO e o arquivo *.jks foi gerado com o keytool do java.
Sou 100% newbie em cetificação digital, e a parte que estou apanhando é justamente essa. Criei um web service simples com o Apache CXF, da seguinte forma:
[code]@WebService
public interface NomeService {
public String consultaCPF (String cpfConsultar);
}
@WebService(endpointInterface = “caminho.para.a.interface.NomeService”, serviceName = “NomeService”)
public class NomeServiceImpl implements NomeService {
public String consultaCPF (String cpfConsultar){
//validacoes basicas
//Acesso ao web service da receita
}
}[/code]
Eu faço o acesso ao web service da Receita da mesma forma como na classe de teste, mostrada acima. Após isso, comecei a procurar como fazer a configuração do SSL no Tomcat 6, mas não estou entendendo exatamente como funciona.
Por exemplo, na documentação oficial, o primeiro passo descrito é criar o arquivo keystore. No meu cenário, pelo que entendi, não devo fazer esse passo, pois já possuo o arquivo keystore, que seria o meu arquivo *.jks. Procede?
O passo seguinte seria editar o server.xml, descomentando o “SSL HTTP/1.1 Connector” e acertando os valores. Tentei algo assim:
<Connector
port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="meu_arquivo_jks" keystorePass="senha"
clientAuth="false" sslProtocol="TLS"/>
No caso, coloquei no parâmetro keystoreFile o caminho para o meu arquivo *.jks. Testei iniciar o Tomcat para confirmar esta configuração, logo na inicialização ocorre o erro:
java.io.IOException: jsse.invalid_ssl_conf
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.checkConfig(JSSESocketFactory.java:817)
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.init(JSSESocketFactory.java:522)
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.createSocket(JSSESocketFactory.java:156)
at org.apache.tomcat.util.net.JIoEndpoint.init(JIoEndpoint.java:538)
at org.apache.coyote.http11.Http11Protocol.init(Http11Protocol.java:176)
at org.apache.catalina.connector.Connector.initialize(Connector.java:1022)
at org.apache.catalina.core.StandardService.initialize(StandardService.java:703)
at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:838)
at org.apache.catalina.startup.Catalina.load(Catalina.java:538)
at org.apache.catalina.startup.Catalina.load(Catalina.java:562)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:261)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: javax.net.ssl.SSLException: No available certificate or key corresponds to the SSL cipher suites which are enabled.
at com.sun.net.ssl.internal.ssl.SSLServerSocketImpl.checkEnabledSuites(SSLServerSocketImpl.java:310)
at com.sun.net.ssl.internal.ssl.SSLServerSocketImpl.accept(SSLServerSocketImpl.java:255)
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.checkConfig(JSSESocketFactory.java:813)
Achei vários artigos falando sobre este problema, mas, com o WebShepre ou o Jboss, nada no Tomcat. Fiz um teste diferente, retirando esta configuração e tentando a importação do certificado, seguindo este artigo:
Desta vez, inicio o tomcat sem erros, mas, quando vou testar a aplicação, sempre paro na exceção:
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:318)
... 72 more
Passei por alguns outros artigos enquanto googlava estas exceções, mas, vejo que o problema é conceitual meu, de não estar entendendo exatamente o que deve ser feito. :oops:
Alguém poderia me dar uma luz?
Muito obrigada!