Criptografia por certificado

5 respostas
S

Galera andei lendo o artigo do Daniel http://www.guj.com.br/article.show.logic?id=141 , consegui fazer o exemplo dele, criando um certificado, e trabalhando em cima dele.
Meu problema é que ao tentar fazer os mesmos passos com o certificado que me passaram, o retorno no private key é null, o certificado somente tem uma chave public, agora minha duvida é, o que devo fazer para conseguir esta chave privada, tenho que cria-la?
Não sou o criador do WS, simplesmente me passaram o wsdl e o certificado, agora estou com duvida de como proceder.

5 Respostas

E

A ideia da criptografia é que, tendo a chave pública, você não possa conseguir, em tempo hábil (digamos algumas centenas de anos com a tecnologia pública atual) obter a chave privada.

Você precisa de um certificado em formato PFX (PKCS#12), ou mesmo em um keystore.

Se o certificado existe em um smartcard ou crypto token, você pode solicitar que o smartcard efetue a operação de assinatura (e dependendo do smartcard ele também pode efetuar a operação de criptografia), mas a chave privada nunca “sai” dele. Ela é sempre null, e as operações criptográficas são feitas pelo próprio dispositivo, não pelo seu computador.

S

há to meio confuso, é que neste tutorial ele está fazendo a parte do servidor, gerando uma chave e testando ela, no meu caso eu possuo um certificado com uma chave publica e a senha do certificado, e quero acessar o ws, então qual seria o meu papel?
Tipo tenho que pegar minha mensagem a passar para o webservice e usar o certificado para criptografar a mensagem?

E

Ah, você tem a senha do certificado? Então pode obter a chave privada (se isso que você tem é um keystore ou um PKCS#12, também chamado de PFX).

S

Então eu tenho a senha do certificado, e olhando pelo Keystore ele não possue uma chave privada, apenas uma chave publica, acho que isso seja pq o cliente apenas exige criptografia no envio, na resposta creio que venha sem criptografia, minha duvida agora é como proceder já que possuo a chave do certificado e consigo pegar a chave publica dele.

S

Se eu tentar me conectar com o Webservice de forma normal, me retorna o erro codigo 500 e a mensagem Internal Server Error acho que isso pq no server ele tenta descriptografar algo que não está criptografado e acontece uma exceção.

System.setProperty("javax.net.ssl.keyStoreType", "JKS");
            System.setProperty("javax.net.ssl.keyStorePath", "C:/arquivo/pamcard914460000150c.ks");
            System.setProperty("javax.net.ssl.keyStore", "C:/arquivo/pamcard914460000150c.ks");
            System.setProperty("javax.net.ssl.keyStorePassword", "****");
            System.setProperty("javax.net.ssl.trustStoreType", "JKS");
            System.setProperty("javax.net.ssl.trustStorePassword", "****");
            System.setProperty("javax.net.ssl.trustStore", "C:/arquivo/pamcard914460000150c.ks");

ao tratar o codigo com uma conexão por ssl e certificado, o seguinte erro é exibido

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 sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
        at searaws.Main.searaWSold(Main.java:287)
        at searaws.Main.main(Main.java:38)
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

Poderia me ajudar?

Criado 2 de outubro de 2009
Ultima resposta 2 de out. de 2009
Respostas 5
Participantes 2