it-swarm-pt.tech

como capturar https com violinista, em java

Estou executando o seguinte programa Java no IDE Eclipse:

import Java.net.*;
import Java.io.*;

public class HH
{
    public static void main(String[] args) throws Exception
    {
        //if i comment out the system properties, and don't set any jvm arguments, the program runs and prints out the html fine.
        System.setProperty("http.proxyHost", "localhost"); 
        System.setProperty("http.proxyPort", "8888"); 
        System.setProperty("https.proxyHost", "localhost"); 
        System.setProperty("https.proxyPort", "8888"); 

        URL x = new URL("https://www.google.com");
        HttpURLConnection hc = (HttpURLConnection)x.openConnection();

        hc.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.0)
        AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2");

        InputStream is = hc.getInputStream();

        int u = 0;
        byte[] kj = new byte[1024];
        while((u = is.read(kj)) != -1)
        {
            System.out.write(kj,0,u);
        }
        is.close();
    }
}

Isso produz a seguinte exceção, se o violinista estiver EXECUTANDO, durante a captura e não:

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 ...

Se eu fechar o violinista, o programa será executado sem exceção, produzindo o html no URL ao qual estou me conectando.

alternativamente, se eu especificar System.setProperty("https.proxyPort", "443");, em vez de: System.setProperty("https.proxyPort", "8888");, ele executa e imprime todo o html, sem exceções, mesmo enquanto o violinista está aberto, no modo de captura, mas ainda não há capturando do violinista.

Então, se eu definir essas propriedades do sistema através dos argumentos jvm do Eclipse, como: -DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888, A mesma exceção exata acontecerá novamente, desde que o aplicativo violinista esteja em execução, tanto no modo de captura quanto no de não captura. Se eu fechar o violinista, o programa será executado perfeitamente.

Se eu usar: System.setProperty("http.proxyHost", "127.0.0.1"); em vez de: System.setProperty("http.proxyHost", "localhost");, ele funciona bem com o aplicativo violinista em execução, tanto no modo de captura quanto no/não, mas também SEM tráfego capturado.

Existe alguém lá fora, capaz de capturar seu próprio tráfego https com o violinista, NÃO através de um navegador da Web, mas através de um programa Java? Quais são os argumentos da jvm, como você o configura? isso? obrigado

50
Sam Adamsh

Crie um keystore contendo o certificado do Fiddler. Use esse keystore como o armazenamento confiável para a JVM, juntamente com as configurações de proxy.

Veja como fazer isso:

  • Exportar certificado raiz do Fiddler

Ferramentas -> Opções do Fiddler ... -> HTTPS -> Exportar certificado raiz para a área de trabalho

  • Crie um keystore com este certificado

Abra a linha de comando como administrador (o keytool não funciona de outra forma)

<JDK_Home>\bin\keytools.exe -import -file C:\Users\<Username>\Desktop\FiddlerRoot.cer -keystore FiddlerKeystore -alias Fiddler

Digite uma senha quando solicitado. Isso deve criar um arquivo chamado FiddlerKeystore.

  • Agora inicie a JVM com o Fiddler como proxy e esse keystore como o armazenamento confiável. Você precisará destes vmargs:

-DproxySet = true

-DproxyHost = 127.0.0.1

-DproxyPort = 8888

-Djavax.net.ssl.trustStore = <caminho\para\FiddlerKeystore>

-Djavax.net.ssl.trustStorePassword = <Senha do Keystore>

Use esses vmargs em sua configuração de execução do Eclipse e você deve estar pronto.

Consigo capturar solicitações HTTPS feitas da JVM sem problemas com esta configuração.

98
CodeMangler

Você também pode importar a chave do violinista para Java armazenamento de certificados confiáveis:

  1. Exportar certificado raiz do Fiddler

    Ferramentas -> Opções do Fiddler ... -> HTTPS -> Ações -> Exportar certificado raiz para a área de trabalho

  2. Executar como administrador:

"keytools.exe" -import -noprompt -trustcacerts -alias FiddlerRoot -arquivo c:\work\FiddlerRoot.cer -keystore "C:\Arquivos de Programas\Java\jdk1.7.0_79\jre\lib\security\cacerts" -storepass mude

Também tive um problema ao descriptografar o tráfego https do Google API Client com o Fiddler. O problema era que, por padrão, ele usa seu próprio repositório de certificados:

InputStream keyStoreStream = GoogleUtils.class.getResourceAsStream("google.jks");
SecurityUtils.loadKeyStore(certTrustStore, keyStoreStream, "notasecret");

E é assim que eu consertei isso:

 HttpTransport transport = new NetHttpTransport() 
 //istead of transport = GoogleNetHttpTransport.newTrustedTransport();
4
zenden2k

Crie um keystore contendo o certificado do violinista e use-o:

Java -DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888 -Dhttps.proxyPort=8888 -Dhttps.proxyHost=127.0.0.1 -Djavax.net.ssl.trustStore=<path to FiddlerKeystore> -Djavax.net.ssl.trustStorePassword=<password> -jar test.jar

Se você usar bibliotecas HTTP de terceiros, precisará definir os proxies de conexão. Exemplo com o Apache Commons HttpClient:

HttpClient httpClient = new HttpClient();
httpClient.getHostConfiguration().setProxy("localhost", 8888);

ATUALIZAÇÃO:

se você estiver usando o Apache HttpClient 4.5.5 ou mais recente, precisará fazer o seguinte:

HttpHost proxy = new HttpHost("localhost", 8888, "http");
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
CloseableHttpClient httpclient = HttpClients.custom()
                .setRoutePlanner(routePlanner)
                .build();
4
Dimmduh

Descobri que também exigia o seguinte Java opções de linha de comando

-Dhttps.proxyPort=8888 
-Dhttps.proxyHost=127.0.0.1
2
Brook