Server akzeptiert neues Zertifikat nicht

Maliko

Bekanntes Mitglied
Hey,

ich verzweifle gerade an einem Problem. Und zwar habe ich einen SOAP-Webservice, welcher auf meinem Rechner zum Test local läuft. Das Problem ist, dass das Zertifikat welches damals verwendet wurde inzwischen seit einem Jahr abgelaufen ist (selbstsigniert). Der Server startet zwar noch problemlos und im Browser kann ich die WSDL auch aufrufen, aber mein Client verweigert natürlich die Verbindung weil das Zertifikat abgelaufen ist.

Daher habe ich jetzt ein neues Selfsigned-Cert erstellt (läuft ja zum Test bei mir nur local und live funktioniert es auch weil anderes und gültiges Zertifikat) und in den Keystore importiert, doch dieses wird scheinbar nicht akzeptiert. Wenn ich das alte drin lasse, läd er trotzdem einfach das alte abgelaufene Zertifikat und wenn ich das alte Zertifikat lösche bekomme ich plötzlich die Fehlermeldung "Beim Verbinden mit 127.0.0.1:5642 trat ein Fehler auf. PR_END_OF_FILE_ERROR".

Da ich von diesem Zertifikatskram nur absolute Grundkenntnisse habe (ich bin nun mal Entwickler und kein SysAdmin) hab ich nicht die geringste Ahnung was da jetzt schief gelaufen ist. Das Zertifikat ist im Keystore drin und es ist auch gültig. Hat irgendjemand eine Ahnung was da schief läuft? Wie schon gesagt mit dem alten Zertifikat kann ich im Browser zumindest die WDSL aufrufen, wenn ich die Warnmeldung wegklicke.
 
Da gibt es viele Möglichkeiten, z.B.: wäre es möglich, dass zur Laufzeit ein anderer Keystore genutzt wird, als der den du bearbeitet hast.
 
Nope das kann nicht sein, da ich den Pfad zum Keystore explizit angebe. Und wie schon gesagt, solange das alte Zertifikat im Keystore ist, läd er es auch und ich kann die WSDL aufrufen. Sobald ich es rauslösche und nur noch das neue drin ist nicht mehr. Es wird definitiv der Keystore verwendet.
 
Wie genau greifst Du auf das Zertifikat zu? Bekommst Du dabei ggf. irgendwelche Fehlermeldungen? Ohne Details ist es sehr schwer, etwas konkretes zu sagen und herum raten macht wenig Sinn.
 
Nein das ist ja das merkwürdige. Der Server startet ganz normal ohne Fehler. Ich kann nur nicht drauf zugreifen. Ich bekomme also auch keinen SSL-Error.
 
Der Server ist selbst geschrieben. Daher habe ich das ursprünglich auch im Bereich Netzwerk gepostet. Keine Ahnung warum das überhaupt hier rüber verschoben wurde.

Der Quellcode des Servers selbst ist folgender:

Java:
ExecutorService executor = Executors.newFixedThreadPool(20);
     
this.endpoint = Endpoint.create(new WebServiceImpl());
InetSocketAddress address;
char[] password;
FileInputStream input;

if(!GlobalProperties.isLocal()) {
    if(!GlobalProperties.isDebug()) {
        address = new InetSocketAddress(InetAddress.getByName("service.domain.ltd"), 5642);
        password = "xxx".toCharArray();
        input = new FileInputStream(System.getProperty("user.dir") + "\\lib\\security\\prod.jks");
    } else {
        address = new InetSocketAddress(InetAddress.getByName("service.domain.ltd"), 5643);
        password = "xxx".toCharArray();
        input = new FileInputStream(System.getProperty("user.dir") + "\\lib\\security\\prod.jks");
    }
} else {
    if(!GlobalProperties.isDebug()) {
        address = new InetSocketAddress(InetAddress.getByName("127.0.0.1"), 5642);
    password = "xxx".toCharArray();
    input = new FileInputStream(System.getProperty("user.dir") + "\\lib\\security\\localhost.jks");
    } else {
        address = new InetSocketAddress(InetAddress.getByName("127.0.0.1"), 5643);
        password = "xxx".toCharArray();
        input = new FileInputStream(System.getProperty("user.dir") + "\\lib\\security\\localhost.jks");
    }
}

this.server = HttpsServer.create(address, 0);
SSLContext ssl = SSLContext.getInstance("TLSv1.2");

KeyStore store = KeyStore.getInstance("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);

this.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 (NoSuchAlgorithmException e) {
            System.out.println(e.getMessage());
        }
    }
});

this.server.start();

HttpContext context = server.createContext("/service");
this.endpoint.setExecutor(executor);
this.endpoint.publish(context);

Ok, keine Fehlermeldungen. Details gibst du aber weiterhin nicht....
Ich konnte dir gestern leider keine genaueren Details mehr geben, da ich nicht mehr im Büro war, sondern bereits zu Hause. Ich hoffe der Quellcode reicht zum Verständnis. Falls nicht, sag mir einfach was für Infos du brauchst, dann geb ich sie dir gerne. Notfalls kann ich auch das SSL-Zertifikat anhängen. Ist ja von mir selbst erstellt.

Edit: Beim Debuggen hab ich auch sichergestellt, dass er den localhost-Keystore läd und nicht den Prod. Im Prod-Keystore ist das live-Zertifikat dass auch einwandfrei funktioniert. Der Unterschied bei den beiden Ports ist übrigens dass der 5642 auf die Livedatenbank geht und der 5643 auf die Testdatenbank (also unser Testsystem). Da die beide gleichzeitig laufen, brauchten wir halt 2 Ports. Nur zur Erklärung. Und die beiden this-Variablen werden auf Klassenebene defininiert, ich hab jetzt nur die Funktion gepostet, die den Server startet. Es gibt noch eine Funktion die den Server stoppt, die halt auch auf die this-Variablen zugreift.
 
Zuletzt bearbeitet:
Also der Code sieht erst einmal ok aus - und deine Aussage, dass es so ja schon funktionierte / in Produktion funktioniert dürfte das bestätigen.

Wenn Du das alte Zertifikat drin lässt, dann ist es "normal", dass dies genommen wird. Der default KeyManager nnimmt immer das erste Zertifikat, dass er findet.

Der Fehler, den Du beschreibst, kommt aber vom Client, oder? Auf dem Server hast Du keine Meldungen zu dem Verbindungsversuch, richtig?

Kannst Du einmal mit dem Webbrowser auf die Applikation zugreifen? Da kann man dann hoffentlich mehr Informationen zu den Problemen des Handshakes finden. (Unabhängig davon, ob Du das http Protokoll komplett falsch ist - ich hoffe, dass er da auch beim Browser nicht erst zu kommen wird.)

Unabhängig davon wäre der zweite Ansatz, dass man einfach einmal durchgeht, wie Du das Zertifikat erstellt hast und was da alles mit in deinem Keystore drin ist. Ich vermute hier ein Problem. Schau im alten einmal rein - da dürftest Du neben dem eigentlichen Zertifikat mehr finden. Zumindest ein intermediate Zertifikat dürfte da noch mit drin sein. (Das Du vermutlich im Laufe der Generierung mit erstellt hast). Wenn Du alles komplett neu gemacht hast und nicht sozusagen "die alte Cert Stelle" erneut verwendet hast, dann müssten hier diese zusätzlichen Zertifikate auch getauscht werden.
 
Hey,

die Fehlermeldung die ich im ersten Post geschrieben habe, bekomme ich sowohl im Browser als auch im Client. Das macht tatsächlich keinen Unterschied.

Bezüglich des Keystores allgemein schaue ich mir das mal genauer an.

Edit: Problem gelöst. Es war tatsächlich der Keystore ansich gewesen. Ich hab jetzt einfach den kompletten Keystore ersetzt und jetzt funktioniert es wieder.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben