Keine Verbinung zu Java-Https-Server möglich (Handshake-Fail)

Maliko

Bekanntes Mitglied
Hoi,

ich hoffe ich hab den Thread im richtigen Bereich erstellt und dass es noch ein Anfängerproblem ist. Und zwar habe ich das Problem, dass ich einen Webservice geschrieben habe, der unter HTTP auch einwandfrei funktioniert hat (es liegt also nicht am Service selbst). Nun wollte ich das ganze dann auf HTTPS umstellen und irgendwie bekomme ich ihn nicht zum laufen. Der Compiler gibt keine Fehler und er läuft auch ganz normal durch.

Folgenden Code verwende ich für die Initialisierung des Servers:

Java:
System.out.println("Server is starting");
      
        ExecutorService executor = Executors.newFixedThreadPool(5);
        Endpoint endpoint = Endpoint.create(new Webservice());
      
        InetSocketAddress address = new InetSocketAddress(InetAddress.getByName("127.0.0.1"), 8080);
        HttpsServer server = HttpsServer.create(address, 0);
        SSLContext ssl = SSLContext.getInstance("TLS");
      
        char[] password = "123456".toCharArray();
        KeyStore store = KeyStore.getInstance("JKS");
        FileInputStream input = new FileInputStream(System.getProperty("user.dir") + "\\lib\\security\\localhost.jks");
        store.load(input, password);
      
        KeyManagerFactory keyManager = KeyManagerFactory.getInstance("SunX509");
        keyManager.init(store, password);
      
        TrustManagerFactory trustManager = TrustManagerFactory.getInstance("SunX509");
        trustManager.init(store);
      
        ssl.init(keyManager.getKeyManagers(), trustManager.getTrustManagers(), null);
        server.setHttpsConfigurator(new HttpsConfigurator(ssl) {
            @Override
            public void configure(HttpsParameters params) {
                try {
                    SSLContext context = SSLContext.getDefault();
                    SSLEngine engine = context.createSSLEngine();
                    params.setNeedClientAuth(false);
                    params.setCipherSuites(engine.getEnabledCipherSuites());
                    params.setProtocols(engine.getEnabledProtocols());
                    params.setSSLParameters(context.getDefaultSSLParameters());
                } catch (Exception e) {
                }
            }
        });
      
        HttpContext context = server.createContext("/webservice");
      
        server.start();
        endpoint.setExecutor(executor);
        endpoint.publish(context);
      
      
        System.out.println("Server is listening on https://127.0.0.1:8080/webservice");
        System.out.println("Server is running");

Versuche ich jetzt über die URL https://127.0.0.1:8080/webservice?wsdl an die WSDL zu gelangen um daraus die entsprechenden Klassen für den Service zu generieren, dann bekomme ich folgende Fehlermeldung:

Problem with downloading wsdl or schema file.
Check the URL, proxy settings or whether the server is running.
URL: https://127.0.0.1:8080/webservice?wsdl.

Jemand eine Idee, was ich da falsch mache und wie ich an die Daten komme? Ich hab so etwas noch nie gemacht und in der Ausbildung spielte Netzwerkkommunikation nie eine Rolle.

Viele Grüße
Maliko
 

Maliko

Bekanntes Mitglied
Ich bekomme zumindest keine Geworfen wenn ich im catch System.out.println(e.getMessage()); verwendet. Versuche ich zu debuggen, überspringt er auch den gesamten override-Bereich, einen Breakpoint reinzusetzen bringt ebenfalls nichts.
 

Maliko

Bekanntes Mitglied
Falls das weiter hilft, ich hab gerade mal im Client unter http die WSDL gezogen und wenn ich jetzt versuche nen Zugang zu bekommen, bekomme ich folgende Fehlermeldung:


Java:
Exception in thread "main" com.sun.xml.internal.ws.wsdl.parser.InaccessibleWSDLException: 2 counts of InaccessibleWSDLException.

javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

    at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.tryWithMex(RuntimeWSDLParser.java:260)
    at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:231)
    at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:194)
    at com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser.parse(RuntimeWSDLParser.java:163)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:348)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:306)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:215)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:196)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:192)
    at com.sun.xml.internal.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:104)
    at javax.xml.ws.Service.<init>(Service.java:77)
    at webservice.ServiceImplService.<init>(ServiceImplService.java:50)
    at clienttest.ClientTest.main(ClientTest.java:52)
C:\xxx\xxx\ClientTest\nbproject\build-impl.xml:1040: The following error occurred while executing this line:
C:\xxx\xxx\ClientTest\nbproject\build-impl.xml:805: Java returned: 1
BUILD FAILED (total time: 2 seconds)

Es scheint also definitiv ein Problem mit den Zertifikaten zu sein. Für localhost habe ich selbst eines über keytool erstellt und dieses auch in den KeyStore des Servers und in den allgemeinen Keystore von Java implementiert. Hier auch noch mal der Client:

Java:
System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2");
          
ServiceImplService ws = new ServiceImplService(new URL("https://127.0.0.1:8080/webservice"));
ServiceImpl port = ws.getServiceImplPort();

String test = port.getVersion();
 

mihe7

Top Contributor
dass es noch ein Anfängerproblem ist.
Würde ich nicht sagen.

Mal getestet:
Code:
keytool -genkey -alias alias -keypass 123456  -keystore localhost.jks -storepass 123456

Dein Code (um eine Klasse außenrum ergänzt und Zugriff auf localhost.jks im aktuellen Verzeichnis)
Java:
import java.security.*;
import java.io.*;
import java.net.*;
import com.sun.net.httpserver.*;
import java.util.concurrent.*;
import javax.xml.ws.*;
import javax.net.ssl.*;
import javax.jws.*;

@WebService(targetNamespace="test")
public class Server {

    @WebMethod
    public String greet() { return "Hello World!"; }

    public static void main(String[] args) throws Exception {

        System.out.println("Server is starting");
      
        ExecutorService executor = Executors.newFixedThreadPool(5);
        Endpoint endpoint = Endpoint.create(new Server());
      
        InetSocketAddress address = new InetSocketAddress(InetAddress.getByName("127.0.0.1"), 8080);
        HttpsServer server = HttpsServer.create(address, 0);
        SSLContext ssl = SSLContext.getInstance("TLS");
      
        char[] password = "123456".toCharArray();
        KeyStore store = KeyStore.getInstance("JKS");
        FileInputStream input = new FileInputStream("localhost.jks");
        store.load(input, password);
      
        KeyManagerFactory keyManager = KeyManagerFactory.getInstance("SunX509");
        keyManager.init(store, password);
      
        TrustManagerFactory trustManager = TrustManagerFactory.getInstance("SunX509");
        trustManager.init(store);
      
        ssl.init(keyManager.getKeyManagers(), trustManager.getTrustManagers(), null);
        server.setHttpsConfigurator(new HttpsConfigurator(ssl) {
            @Override
            public void configure(HttpsParameters params) {
                try {
                    SSLContext context = SSLContext.getDefault();
                    SSLEngine engine = context.createSSLEngine();
                    params.setNeedClientAuth(false);
                    params.setCipherSuites(engine.getEnabledCipherSuites());
                    params.setProtocols(engine.getEnabledProtocols());
                    params.setSSLParameters(context.getDefaultSSLParameters());
                } catch (Exception e) {
                }
            }
        });
      
        HttpContext context = server.createContext("/webservice");
      
        server.start();
        endpoint.setExecutor(executor);
        endpoint.publish(context);
      
      
        System.out.println("Server is listening on https://127.0.0.1:8080/webservice");
        System.out.println("Server is running");
    }
}

Übersetzen und starten:
Code:
javac -cp . Server.java
java -cp . Server
Dann per curl (das -k ist dazu da, die Prüfung des Zertifikats abzuschalten):
Code:
curl -k https://127.0.0.1:8080/webservice?wsdl
liefert
Code:
<?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. --><!-- Generated by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. --><definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="test" name="ServerService">
<types>
<xsd:schema>
<xsd:import namespace="test" schemaLocation="https://127.0.0.1:8080/webservice?xsd=1"></xsd:import>
</xsd:schema>
</types>
<message name="greet">
<part name="parameters" element="tns:greet"></part>
</message>
<message name="greetResponse">
<part name="parameters" element="tns:greetResponse"></part>
</message>
<portType name="Server">
<operation name="greet">
<input wsam:Action="test/Server/greetRequest" message="tns:greet"></input>
<output wsam:Action="test/Server/greetResponse" message="tns:greetResponse"></output>
</operation>
</portType>
<binding name="ServerPortBinding" type="tns:Server">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"></soap:binding>
<operation name="greet">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal"></soap:body>
</input>
<output>
<soap:body use="literal"></soap:body>
</output>
</operation>
</binding>
<service name="ServerService">
<port name="ServerPort" binding="tns:ServerPortBinding">
<soap:address location="https://127.0.0.1:8080/webservice"></soap:address>
</port>
</service>
 

Maliko

Bekanntes Mitglied
Na ganz klasse. Ich bin einfach nur unheimlich dämlich. Mit dem Code war in der Tat alles in Ordnung. Das was das Problem war, war das Zertifikat. Ich hatte nämlich den falschen Keystore drin. Nachdem ich den richtigen eingetragen habe, funktionierte es. Sorry für den vollkommen überflüssigen Thread. Und wieder einmal Zeigt es, der Fehler sitzt immer 90 cm vom Monitor weg.
 

Maliko

Bekanntes Mitglied
In dem Falle leider ich.

Aber ne kleinigkeit hab ich noch. Will dafür keinen eigenen Thread erstellen, also häng ich es hier noch mal an. Und zwar bekomme ich jetzt mit dem Browser eine Verbindung, wenn ich aber versuche mit dem Client drauf zuzugreifen, renn ich in den Proxy.

Ich versuche momentan die Produktivurl zu testen. Sprich die, unter welcher das System nachher laufen soll. Dafür habe ich unser Wildcard-Zertifikat eingebunden, die URL in der hosts auf 127.0.0.1 gesetzt und eine Ausnahme in den Interneteinstellungen für den Proxy gesetzt. Im Browser funktioniert der Aufruf der WSDL auch einwandfrei (inkl. grünen Schloss).

Der Aufruf des Clients allerdings rennt weiterhin in den Proxy und kommt nicht durch. Ich habe dann im Java Control Panel eine Ausnahme für die URL der WSDL eingerichtet, jetzt komme ich an dem Punkt weiter, doch wenn ich den Request absetze, werde ich wieder vom Proxy geblockt.

Hat von euch vielleicht jemand eine Ahnung wie ich Java sagen kann, dass er die komplette Domain auf die Ausnahmeliste setzen soll?

Java:
System.setProperty("java.net.useSystemProxies", "true");
          
ServiceImplService ws = new ServiceImplService(new URL("https://development.xxx.de:8080/webservice"));
ServiceImpl port = ws.getServiceImplPort();

String test = port.getVersion();

In der letzten Zeile springt er mir dann wieder raus.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Tomcat8 keine Ausgabe mit System.out.println in catalina.out Server einrichten und konfigurieren 5
A Tomcat bekommt keine Schreibrechte für webapps Server einrichten und konfigurieren 6
M Glassfish server rendert keine Tags Server einrichten und konfigurieren 4
M Wenn Classloader isolation dann keine JNDI Verbindung mit Webapp in Jboss Server einrichten und konfigurieren 2
V Tomcat findet keine Klassen Server einrichten und konfigurieren 8
QU3LLC0D3 Hosting von (u.a.) Java- und Node.js Anwendungen Server einrichten und konfigurieren 6
K "Java-11-openjdk-headless" + Abhängigkeiten manuell installieren / Ohne Internet Server einrichten und konfigurieren 1
J ich kann meinen Craftbukkitserver 1.15.2 nicht starten, obwohl ich Java installiert habe und es über 13 ist Server einrichten und konfigurieren 5
D java code auf Xampp laufen lassen Server einrichten und konfigurieren 5
D Java Applikation als Backend (REST) absichern Server einrichten und konfigurieren 28
K Tomcat - Java-Version? Server einrichten und konfigurieren 5
E Bekomme java.lang.IllegalStateException und java.lang.ClassNotFoundException beim deployen Server einrichten und konfigurieren 0
I JAVA EE Server mit integrierter Datenbank Server einrichten und konfigurieren 0
M Java-EJB-Anwendung auf Server bzw. Client deployen Server einrichten und konfigurieren 0
M Glassfish 4: java.net.MalformedURLException: Bad URL path Server einrichten und konfigurieren 7
J Java Programm auf Linux Server Laufen lassen Server einrichten und konfigurieren 6
A internal exception: java.io.ioexception: an existing connection was forcibly closed by remote host ? Server einrichten und konfigurieren 2
P Ständige Java.Authentifizierung Server einrichten und konfigurieren 0
P Problem "Java Heap Space" Server einrichten und konfigurieren 5
TheJavaKid Cent OS für Java und MySQL konfigurieren Server einrichten und konfigurieren 21
E Ubuntu Java pfad Server einrichten und konfigurieren 5
B Java VM Bezugsquelle Server einrichten und konfigurieren 5
R Java-update auf Debian-Etch Server einrichten und konfigurieren 11
I Beurteilung der Serverausstattung für JAVA Programm Server einrichten und konfigurieren 10
F Weblogic und Java 1.5 parallel GC sinvoll? Server einrichten und konfigurieren 3
G VServer Java Server einrichten und konfigurieren 19
M Java Applikation auf Webserver - was brauche ich dafür? Server einrichten und konfigurieren 7
M MySQL/Tomcat mit java.net.SocketException "Broken Pipe& Server einrichten und konfigurieren 1
V Java-Klasse mit Tomcat starten (kein Servlet) Server einrichten und konfigurieren 5
S Java und CGI Server einrichten und konfigurieren 2
J tools.jar fehler ::: java.lang.RuntimeException Server einrichten und konfigurieren 14

Ähnliche Java Themen

Neue Themen


Oben