Erro Certificado

Galera, recebi um certificado digital para acessar um webservice, ele veio no formato jks junto com a senha.
Fiz os seguintes comandos.

keytool -export -keystore certificatec.ks -alias client -file meucert.cer //retirei meu certificado do jks
keytool -import -keystore clientkeystore -file meucert.cer -alias client //criei um keystore novo com meu certificado

no codigo estou usando as seguintes linhas abaixo.

            System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
            Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
            System.setProperty("javax.net.ssl.keyStoreType", "JKS");
            System.setProperty("javax.net.ssl.keyStore", "C:/arquivo/certificate.ks");
            System.setProperty("javax.net.ssl.keyStorePassword", "123456");
            System.setProperty("javax.net.ssl.trustStoreType", "JKS");
            System.setProperty("javax.net.ssl.trustStore", "C:\\arquivo\\clientkeystore");
            System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

E o seguinte erro está ocorrendo:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1591)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:975)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:123)
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1096)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1107)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:405)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
        at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:832)
        at com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl.getOutputStream(HttpsURLConnectionOldImpl.java:200)
        at clientws.Main.clientWSold(Main.java:307)
        at clientws.Main.main(Main.java:44)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:285)
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:191)
        at sun.security.validator.Validator.validate(Validator.java:218)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:954)
        ... 13 more
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:280)
        ... 19 more
CONSTRUÍDO COM SUCESSO (tempo total: 3 segundos)

Alguem sabe me dizer o que eu fiz de errado? Obrigado!

   1. System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");  
   2. Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());  
   3. System.setProperty("javax.net.ssl.keyStoreType", "JKS");  
   4. System.setProperty("javax.net.ssl.keyStore", "C:/arquivo/certificate.ks");  
   5. System.setProperty("javax.net.ssl.keyStorePassword", "123456");  
   6. System.setProperty("javax.net.ssl.trustStoreType", "JKS");  
   7. System.setProperty("javax.net.ssl.trustStore", "C:\\arquivo\\clientkeystore");  
   8. System.setProperty("javax.net.ssl.trustStorePassword", "changeit");  

Observe nas linha 4 e linha 7, o mesmo método ( System.setProperty(" ") ) recebendo uma String contendo um path
com caracteres slash de forma diferente. Apesar de essas linhas não aparecerem no trace da Exception vale á pena
você debugá-las.
Talvez o método citado consiga entender as duas formas diferentes dos ‘slashs’ contidos nos paths ( linha 4 usa-se o
slash / e a linha 7 usa \). Porém pelo fato de a exceção apontar para um problema de path ( [color=blue]unable to
find valid certification path to requested target[/color] ), podemos levar em conta o problema dos slashs que eu verifiquei.
Recomendo que você use um debug…

Espero ter ajudado…

Se você obeservar na API da sun ( http://java.sun.com/j2se/1.4.2/docs/api/ ) o método estático System.setProperty(…) dispara as seguintes exceções as quais não relacionei diretamente no trace do erro,

[color=blue]Throws:[/color]
SecurityException - if a security manager exists and its checkPermission method doesn’t allow setting of the specified property.
NullPointerException - if key is null.
IllegalArgumentException - if key is empty.

por isso não identifiquei os erros relacionando-se diretamente com as linhas onde existe a chamada do método setProperty().

Cara Obrigado, kkk mas foi eu reniciar a maquina resolveu o problema, vai entender, kkk