Ler cÓdigo fonte de url https

3 respostas
R

Fala comunidade...

Estou com uma pequena bucha....acho...
Seguinte, preciso acessar uma página https e ler o código fonte dela com páginas http consigo ler normalmente.
Meu código é este:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;


public class leURL {

	public static void leiaURL(String strURL) throws MalformedURLException,
			IOException {
		
		URL url = new URL(strURL);		
		BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));
		String linha = "";
		while ((linha = reader.readLine()) != null) {
			System.out.println(linha);
		}
		reader.close();
	}

}

e tenho main que chama o método:

import java.io.IOException;
import java.net.MalformedURLException;

public class TestaLeituraURL {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws MalformedURLException, IOException{

		leURL url = new leURL();
		url.leiaURL("https://alguma pagina em https");

	}
}

Agora o erro que dá ao tentar chamar este método:

Exception in thread "main" 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(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
	at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
	at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
	at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
	at java.net.URL.openStream(Unknown Source)
	at leURL.leiaURL(leURL.java:14)
	at TestaLeituraURL.main(TestaLeituraURL.java:12)
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(Unknown Source)
	at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
	at sun.security.validator.Validator.validate(Unknown Source)
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
	at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(Unknown Source)
	... 15 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
	at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
	at java.security.cert.CertPathBuilder.build(Unknown Source)
	... 20 more

Aguardo uma ajuda e desde já agradeço a comunidade.

3 Respostas

T

Esse erro ocorre normalmente quando a autoridade certificadora que emitiu o certificado para o site não está cadastrada no arquivo cacerts (tipicamente em c:\arquivos de programas\java\jre____\jre\lib\security\cacerts) . Experimente ver se o erro ocorre quando você tentar ler o código-fonte de uma URL https de um site como os de bancos (exceto a Caixa Econômica Federal), que normalmente usam certificados emitidos por uma autoridade certificadora que está cadastrada em cacerts.

T

De qualquer maneira, se o tal site não puder mudar o certificado (sei lá - pode ser que seja muito caro arranjar um certificado “de verdade”) e for muito difícil alterar o cacerts, você pode usar o HttpClient do projeto Jakarta (http://jakarta.apache.org/httpcomponents/httpcomponents-client/index.html ) e ver a documentação .

B

Kríssimo,
para acessar Https é necessário possuir certificado cliente válido instalado na sua máquina, e apresenta-lo para realizar o handshake.
Também estou pesquisando sobre o assunto e ainda não conclui meu proijeto.
Vai uma dica da Internet para evoluir seu processo:

public static X509Certificate load(String cerFileName) throws CertificateException 
	{
		File file = new File(cerFileName);   
	    FileInputStream fis;   
	    try 
	    {   
	         fis = new FileInputStream(file);   
	    } 
	    catch (FileNotFoundException e) 
	    {   
	         throw new IllegalArgumentException("Arquivo " + cerFileName + " não existe.");   
	    }   
	    X509Certificate certificado = X509Certificate.getInstance(fis);   
	    return certificado;   
	 }
Criado 29 de novembro de 2007
Ultima resposta 30 de nov. de 2007
Respostas 3
Participantes 3