# http(s) Verbindung



## Generic1 (18. Jan 2010)

Hallo,

ich steh gerade auf dem Schlauch, vielleicht könnt ihr mir da auf die Sprünge helfen, Ich habe eine ganz normale Web- Anwendung programmiert, mit einem Servlet auf der Server- Seite, zu welchem vom Browser eine http(s) verbindung hergestellt wird, also ganz normaler Aufbau,

jetzt möchte ich hergehen und meine Webanwendung auf 2 Tomcat- Servern laufen lassen, und für eine Webanwendung möchte ich ein Modul programmieren, welches mir eine http(s) Verbindung zur anderen Webanwendung erstellt, so wie wenn sich ein Browser zur WebApplikation1 verbinden würde,

Mir ist jetzt nicht ganz klar, wie ich eine http(s) Verbindung einfach erstellen kann, sodass Webanwendung1 nicht merkt, ob jetzt eine andere Webapplikation dranhängt oder ob es ein Browser ist.

Hat damit jemand Erfahrung und könnte mir tipps dazu geben.

Besten Dank,


----------



## maki (18. Jan 2010)

Vielleciht suchst du ja den commons-httpclient?


----------



## Generic1 (18. Jan 2010)

Kann sein, muss mal richtig drüberschaun, ob das unterstützt wird, was ich benötige, aber besten Dank mal dafür.
d.h. aber auch, dass es mit Bordmitteln von JSE oder JEE nicht möglich ist, sowas zu machen,
Lieg ich da richtig?


----------



## maki (18. Jan 2010)

Soweit ich weiss gibt es in der Java API keinen http Client, man kann sich aber seinen eigenen bauen, oder eben einen nehmen der schon fertig ist


----------



## Noctarius (18. Jan 2010)

Fertig ist da keiner. Aber wie maki schon sagte hat Apache in den Commons einen fertigen. Der btw auch sehr gut arbeitet


----------



## Generic1 (18. Jan 2010)

Hallo,

also ich verwende jetzt mal httpclient, eine http- Verbindung hab ich schon, das war ein Kinderspiel aber jetzt wollte ich eine https Verbindung zu einem Server herstellen mit folgendem Code von HttpClient - HttpClient SSL Guide, (siehe unten).

Ich finde aber leider nicht, in welchem jar sich die Klasse GetMethod und HttpClient verstecken. Ich hab mir folgendes runtergeladen:
HttpComponents - HttpComponents Downloads -> Binary with dependencies, da find ich die Klassen aber nicht.
Weiß jemand, welche jars ich da einbinden muss?

lg



```
HttpClient httpclient = new HttpClient();
        GetMethod httpget = new GetMethod("https://www.verisign.com/");
        try {
            httpclient.executeMethod(httpget);
            System.out.println(httpget.getStatusLine());
            }
        finally {
            httpget.releaseConnection();
            }
```


----------



## Generic1 (18. Jan 2010)

Ich habs leider noch nicht ganz hinbekommen, ich hab vor längerer Zeit für meine Web- Applickation ein Certificat erstellt mit keytool, der Browser hat dann beim ersten Verbindungsversuch gefragt, ob man dem Certificat vertraut, wenn man OK geklickt hat, hat der Browser das Certifikat gespeichert und alles war damit geritzt mit der https- Verbindung.

Meine JavaSE- Anwendung zum Verbinden über https mit der Web- Anwendung schaut momentan so aus wie unten und ich bekomme folgende Fehlermeldung:


```
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(Alerts.java:174)
...
```

d.h. also das in dem unteren Code die Angabe des Certifikates fehlt, kennt sich jemand aus, wie ich dem HttpClient das Certifikat mitteile?

Vielen Dank,



```
import java.io.IOException;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;

public class HttpsConnection {

    public HttpsConnection() throws IOException {
        HttpClient httpclient = new HttpClient();
        GetMethod httpget = new GetMethod("https://localhost:8443/NameMeinerWebanwendung");
        try {
            httpclient.executeMethod(httpget);
            System.out.println(httpget.getStatusLine());
            }
        finally {
            httpget.releaseConnection();
            }
        }

    public static void main(String[] args) throws Exception {
        new HttpsConnection();
        }
}
```


----------



## FArt (18. Jan 2010)

Ähnlich wie ein Browser besitzt eine VM einen Truststore mit trusted authorities. Man kann aber auch einen eigenen verwenden.

Einfache Möglichkeiten:
- das Zertifikat ist echt (z.B. von Thawtee), dann kann die Zertifizierungskette ohne zutun überprüft werden
- das Zertifikat ist selbst signiert und wird den Default-Truststore importiert (uncool)
- du baust einen eigenen Truststore mit dem selbst signierten Zertifikat und konfigurierst die VM entsprechend (Installing and Configuring SSL Support
- du machst das über die API selber, kannst so theoretisch mehrere Truststores verwenden (das ist aufwendiger)

Aber hier die eigentliche Frage:


> jetzt möchte ich hergehen und meine Webanwendung auf 2 Tomcat- Servern laufen lassen, und für eine Webanwendung möchte ich ein Modul programmieren, welches mir eine http(s) Verbindung zur anderen Webanwendung erstellt, so wie wenn sich ein Browser zur WebApplikation1 verbinden würde,


Wieso? Was soll das werden? Geht das, was du eigentlich erreichen möchtest nicht einfacher? Meine Vermutung: ja!


----------



## Generic1 (18. Jan 2010)

>> Wieso? Was soll das werden? Geht das, was du eigentlich erreichen möchtest nicht einfacher? Meine 
>> Vermutung: ja! 

Das hab ich mir nicht ausgedacht und ist deshalb nicht mein Bier.


Hab die Lösung schon gefunden, deshalb als erledigt makiert:

```
final ProtocolSocketFactory socketFactory = new EasySSLProtocolSocketFactory();
            final Protocol https = new Protocol(PROTOCOL, socketFactory, PORT);
            Protocol.registerProtocol(PROTOCOL, https);
```

lg


----------



## FArt (18. Jan 2010)

Ich würde diese Klasse nicht direkt als Lösung ansehen, eher als Krücke ;-)



> This socket factory SHOULD NOT be used for productive systems...



... zugegeben, es liegt vorwiegend an dem selbst signierten Zertifikat ...


----------



## Generic1 (18. Jan 2010)

Ich weiß, hab ich auch gelesen, funktioniert erstmal und das ist mir das wichtigstem, handelt sich nämlich um ein Testsystem, da ist es ok,
lg


----------



## Generic1 (18. Jan 2010)

Eine andere Frage noch, ich hab mich jetzt mit dem oberen Code einloggen können und bekomme die Startseite der Web- Anwendung als html- Code zurück, dass funkt. also mal,

Jetzt möchte/muss ich noch eine AJAX Kommunikation simulieren, 
Ich weiß zwar wie ich AJAX mit JavaScript einsetze (XMLHttpRequest), kann ich das aber auch in einer JavaSE Application irgenwie nachbilden? Gibts da vielleicht auch wieder eine jar, welche das AJAX- Protokoll unterstützt?

Beste Grüße,


----------



## FArt (18. Jan 2010)

guckst du mal bei goolgle oder hier: System Test - Ajax Patterns


----------



## Generic1 (18. Jan 2010)

Hab gerade gegoogelt und bin auf das package gestoßen,

import javax.script.*;

hat mit dem schon mal jemand gearbeitet?


----------



## Noctarius (18. Jan 2010)

Was hast du denn damit vor?


----------



## Generic1 (18. Jan 2010)

ganz einfach gesagt will ich einen Browser- Client mit JavaSE nachbilden, damit der Server nicht merkt ob ein JavaSE- Programm oder ein Browser am Servlet hängt und dazu brauche ich die http und die AJAX- Funktionen.

PS: ist nicht meine Idee!!


----------



## maki (18. Jan 2010)

HttpUnit wäre vielleicht doch passender?


----------



## Noctarius (18. Jan 2010)

Alternativ Webtest: http://webtest.canoo.com/

PS: Host scheint grad nicht sauber aufgelöst zu werden


----------



## Generic1 (19. Jan 2010)

Mit dem javax.script (Java Platform SE 6)
habt ihr noch nicht gearbeitet? 
ich versuch gerade mit dieser Bibliothek eine AJAX Kommunikation zum laufen zu bringen, dass javax.script.* bei den Bordmitteln von JavaSE dabei ist.
Wär super wenn damit schon mal jemand Erfahrungen gemacht hätte ob das überhaupt funktioniert -> AJAX mit dieser Bibliothek.


----------



## Generic1 (19. Jan 2010)

Also ich hab mir jetzt mal http angesehen, komm aber nicht drauf wie ich da eine AJAX- Anfrage an den Server senden soll,
Hat da jemand eine Idee?
lg


----------

