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

Bitte aktiviere JavaScript!
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
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
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.
 
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();
 
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>
 
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.
 
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.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben