# Java HTTPS "peer not authenticated" gelöst nun HTTP-Code 403



## Johannes7146 (6. März 2013)

Hallo zusammen,

seit langem auch mal wieder eine Frage von mir.
Ich möchte gerne mit HttpClient von Apache einen HTTPS Request absetzen und den Response empfange.

Das erste Problem, dass ich hatte war, das ich jedesmal die Meldung "peer not authenticated" bekam.
Dies liegt daran, dass sich das Zertificat des Servers nicht im KeyStore befindet.
Um dieses Problem zu lösen, gibt es 2 Möglichkeiten.
1. Das Zertifikat zum KeyStore manuell hinzufügen (HOWTO)
2. Dem HttpClient einen eigenen X509TrustManager unterschieben, der einfach alles akzeptiert.

Das Problem bei Variante 1 ist, das ich nicht die .cer Datei besitze und das ich nicht auf jemdem System wo mein Code ausgeführt wird das Zertifacte jedesmal manuell hinzufügen möchte.

Daher habe ich mich für Variante 2 entschieden.
Damit ist nun die Meldung verschwunden. Dafür bekomme ich nun ein Response mit dem StatusCode 403 und folgendem content:

```
<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD>
<BODY>
<FONT face="Helvetica">
<big><strong></strong></big><BR>
</FONT>
<blockquote>
<TABLE border=0 cellPadding=1 width="80%">
<TR><TD>
<FONT face="Helvetica">
<big>Access Denied (policy_denied)</big>
<BR>
<BR>
</FONT>
</TD></TR>
<TR><TD>
<FONT face="Helvetica">
Your system policy has denied access to the requested URL.
</FONT>
</TD></TR>
<TR><TD>
<FONT face="Helvetica">

</FONT>
</TD></TR>
<TR><TD>
<FONT face="Helvetica" SIZE=2>
<BR>
For assistance, contact your network support team.
</FONT>
</TD></TR>
</TABLE>
</blockquote>
</FONT>
</BODY></HTML>
```

Jemand eine Idee wir das Problem zu lösen ist?
Bin leider in dem Thema HTTPS nicht so bewandert.


----------



## genodeftest (6. März 2013)

Hi

von 2. rate ich dir stark ab. Wenn der Server HTTPS anbietet, sollte man die Daten auch verschlüsseln. Wenn du jedes Zertifikat akzeptierst, ist das defacto keine Verschlüsselung, weil jeder eine Man-in-The-Middle-Attacke durchführen kann.

Warum lieferst du das Zertifikat nicht einfach mit deinem Quellcode mit? Die .cer-Datei sollte sich sehr einfach bei der zuständigen Zertifizierungsstelle holen lassen. Wenn es eine gängige Website ist, lässt sich das Zertifikat auch aus einigen Browsern heraus exportieren.

Zu der Antwort, die du da gepostet hast, kann ich dir leider nicht helfen. Vielleicht fehlt liegt es am Referrer, an Cookies, an fehlender Authentifizierung per SSL, per Username/Passwort oder per IP-Adresse. Im Zweifelsfall den Server-Admin/Webmaster ansprechen.


----------



## slowfly (7. März 2013)

Wichtig: Du brauchst das Zertifikat, nicht den private Key des Servers 
Das Zertifikat bekommt man, wenn man die Website über HTTPS aufruft. Wenn man z.b. https://www.google.com aufruft, kommt im Firefox links von der Adressleiste ein "Schloss-Symbol" (Schluss, um etwas zu verschliessen, keine Burg). Dort kann man die Zertifikate anschauen und exportieren. Gibt übrigends auch tolle Tools, welche dabei unterstützen.

Was wir bei uns auch immer haben, dass wir die Zertifizierungsstelle eines Zertifikats nicht kennen, dann reicht es, dass wir das root-ca der Zertifizierungsstelle importieren. Es reicht manchmal, sag ich mal... ich blick da auch nicht immer 100%ig durch.

Und: 403 bedeutet "forbidden", das heisst, du hast keine Rechte - unabhängig von der Authentifizierung -, diese URL aufzurufen. Du müsstest eigentlich im Browser für die gleiche URL die gleiche Meldung bekommen.

Gruss
slowy


----------



## Johannes7146 (21. März 2013)

ok, das mit dem 403 Fehler hat sich erledigt.
Das lag daran, dass ich das www. vor der URL vergessen hatte.

Zu  Lösung 2:
Nun bekomme ich einen HTTP-Code 200 (OK) aber der Response-Body ist leider leer.
Habe mit Wireshark die Kommunikation mitgeschnitten (Screenshot im Anhang). Weiß leider noch nicht so ganz wie die Werte zu interpretieren sind. Habe auf einer Seite den Hinweis gefunden das gelbe Schrift auf rotem Hintergrund auf einen Paketverlust hindeutet.

Zu Lösung 1:
Habe das Zertifikat mit folgendem Befehl auf einem Linux rechner heruntergeladen:

```
openssl s_client -connect www.SERVERNAME.TLD:443
```
Aus der Konsole habe ich dann alles folgendes herauskopiert:

```
-----BEGIN CERTIFICATE-----
aasdöklfhaösdkfhakjsdhfökajsdhfkhasdklfjas
faksdhfkjasdhfkjshakdfjhllakjsdfhas
asdkjfhaklsdjfhklasdfsad
asldkjfhaklsjfdhasdf
asdölkfjaöskdj
-----END CERTIFICATE-----
```

Diese habe ich im Text Editor auf meinem Rechner eingefügt und als meinZertifikat.cer gespeichert.
Dann mittels auf meinem Rechner folgendes ausgeführt um das Zertifikat zu importieren:

```
c:\Program Files\Java\jre1.6.0_22\bin>keytool -import -alias alias -file c:\users\meinName\desktop\meinZertifikat.cer -keystore ../lib/security/cacert
```
Leider bleibt die Meldung die gleiche...


```
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
```


----------

