Machen Apache HttpClient 4.3 arbeiten mit sslSocketFactory/HostnameVerifier

Arbeite ich an einem Java-Programm, das senden von POST-requests an eine Webseite für meine Firma zu nutzen. Wir sind nicht der Eigentümer dieser website, Sie sind von uns getrennt. Ich habe gekämpft mit verschiedenen Möglichkeiten, pass eigentlich ist es die sehr wählerisch Parameter, die er will, um für mich zu arbeiten, es von einem Programm (im Gegensatz zu es manuell zu tun).

Habe ich gefunden, dass der Apache-HttpClient 4.3 scheint meine beste route eigentlich versucht, darauf zugreifen, alles Ergebnisse, die in eine wütende Antwort von der website erzählte mir mein Benutzername und Passwort nicht gültig/zulässig.

Aber dann bekam ich eine Fehlermeldung, da die Website-Zertifikat nicht übereinstimmen, kontaktierte ich Ihre Unterstützung, und Sie angeblich teilen sich eine Infrastruktur mit einem anderen Standort, so dass das Zertifikat mismatch zu erwarten ist.

Also ging ich Kommandozeile und generiert eine keystore, übergeben, die sich auf das Programm und dann kam der Fehler "java.Sicherheit.cert.CertificateException: Kein Thema alternative DNS-name matching".

Einige Jagd führte mich zu nutzen, einen überprüfer, die Fehler entfernt.

Dann merkte ich, dass kann ich nicht machen URLConnection/HttpsURLConnection und HttpClient/HttpPost zusammen zu arbeiten. Das ist, wo ich stecken geblieben bin. Ich bin mir nicht sicher, wie man den code, der behandelt meine keystore, TrustManager, SSLSocketFactory, etc eine Verbindung zu dem Teil, wo ich tatsächlich zu verbinden und POSTEN.

Code, der verarbeitet die Zertifikate und Prüfung:

  InputStream in = new FileInputStream(new File("C:\\Program Files (x86)\\Java\\jre7\\bin\\my.keystore")); 
   KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
    ks.load(in, "blahblah".toCharArray()); 
in.close(); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    tmf.init(ks);
     X509TrustManager defaultTrustManager = (X509TrustManager)tmf.getTrustManagers()[0]; 
     SSLContext context = SSLContext.getInstance("TLS"); 
     context.init(null, new TrustManager[] {defaultTrustManager}, null); 
     javax.net.ssl.SSLSocketFactory sslSocketFactory = context.getSocketFactory();

URL url = new URL("https://emailer.driveclick.com/dbadmin/xml_post.pl"); 

     URLConnection con = url.openConnection(); 
    ((HttpsURLConnection) con).setSSLSocketFactory(sslSocketFactory); 
   ((HttpsURLConnection) con).setHostnameVerifier(new Verifier());
     con.connect(); 
    in = con.getInputStream();

Code, der sollte verbindet mich Sie auf der website:

 try {
        //log into the website

        String url2 = "https://emailer.driveclick.com/dbadmin/xml_post.pl";
        HttpClient client = HttpClientBuilder.create().build();



        HttpPost post = new HttpPost(url2);


        post.setHeader("User-Agent", USER_AGENT);

        List<BasicNameValuePair> urlParameters = new ArrayList<>();
        urlParameters.add(new BasicNameValuePair("username", "namefoo"));
        urlParameters.add(new BasicNameValuePair("api_password", "passfoo"));

        post.setEntity(new UrlEncodedFormEntity(urlParameters));

        org.apache.http.HttpResponse response = client.execute(post);

        System.out.println("\nSending 'POST' request to URL : " + url2);
        System.out.println("Post parameters : " + post.getEntity());
        System.out.println("Response Code : " + response.getStatusLine().getStatusCode());

        BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        StringBuffer result = new StringBuffer();
        String line = "";
        while ((line = rd.readLine()) != null)
        {
            result.append(line);
        }
        System.out.println(result.toString());
    } catch (UnsupportedEncodingException ex) {
        Logger.getLogger(LastFileMove.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(LastFileMove.class.getName()).log(Level.SEVERE, null, ex);
    }

EDIT: ich vergaß, Sie zu zählen die kleinen Klasse, die ich für die überprüfung, die ich auf den verwiesen wird.

public class Verifier implements HostnameVerifier 
{

public boolean verify(String arg0, SSLSession arg1) {
        return true;   //mark everything as verified
}
}

Update 5/8/2014
SSLConext und Verifier sind jetzt wie folgt eingerichtet:

SSLContext sslContext = SSLContexts.custom()
    .useTLS()
    .loadTrustMaterial(ks)
    .build(); 
X509HostnameVerifier verifier = new AbstractVerifier() 
{
@Override
public void verify(final String host, final String[] 
cns, final String[] subjectAlts) throws SSLException 
{
    verify(host, cns, subjectAlts, true);
}
};

Und ich habe mich vor und änderte meine HttpClient eine verschließbare hier:

CloseableHttpClient client = HttpClients.custom()
sslSocketFactory)
.setHostnameVerifier(verifier)
.setSslcontext(sslContext)
.build();

Und ich bin wieder zu haben "javax.net.ssl.SSLException: hostname in certificate didn 'T match" - Fehler. Vorschläge?

Haben Sie versucht, die Weitergabe des SSLContext-Instanz der HttpClientBuilder? Ich haben Erfolg mit hatte, vor.
Wenn ich das Tue, dann bekomme ich den " java.Sicherheit.cert.CertificateException: Kein Thema alternative DNS-name " Fehler. Es scheint, ich müsste die überprüfung der HttpClientBuilder, aber ich bin mir nicht ganz sicher, wie ich das machen würde.
setHostnameVerifier ist ein Anfang, zu sehen, ob es funktioniert, wenn Sie verwenden die AllowAllHostnameVerifier. Apache-HttpClient beschlossen, Ihren eigenen verifier basiert auf dieser
Nicht erlauben, alle gefährlich? Oder bin ich verwirrend es mit etwas anderem? Lässt es sich nicht öffnen, Sie sich für ein man in the middle Angriff?
Ja, sehr gefährlich und Total unsicher. Aber es kann verwendet werden, um festzustellen, wo das problem ist beim Test.

InformationsquelleAutor senex_subconscious | 2014-05-07

Schreibe einen Kommentar