SunCertPathBuilderException: unable to find valid certification path to requested target in CN1-app
Bitte können Sie helfen.
Ich habe eine Codenameone app, die sendet eine GET-Anforderung an einen cloud-Tomcat-8-server, und erwartet, dass wieder einige JSON-Antwort. Wichtig das ist ein HTTPS-Aufruf.
Wenn ich die Anfrage im Postbote es funktioniert:
https://www.mydomain.co.uk:8443/MyProject/v1/generate_token
Gleichen URL durch mein browser funktioniert und zeigt, wie "Sicher" und ich kann sehen, mein Zertifikat-details.
Ich kaufte mir ein Zertifikat für mein SSL - /TLS-Konfiguration, und es scheint zu funktionieren Prima in den logs auf Start.
Im simulator bekomme ich wieder die folgende Fehlermeldung an der Stelle, bei der Lektüre der Antwort von der URL-Aufruf - ich glaube, das muss verschlüsselt werden:
Exception: 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
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 sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1959)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1514)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1026)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:961)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1072)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1564)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:347)
at com.codename1.impl.javase.JavaSEPort.getResponseCode(JavaSEPort.java:7591)
at com.codename1.io.ConnectionRequest.performOperation(ConnectionRequest.java:702)
at com.codename1.io.NetworkManager$NetworkThread.run(NetworkManager.java:282)
at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176)
Warum sollte die app anders sein zu Postbote den Aufruf von (Netzwerk-Monitor-Fenster bestätigt die gleiche URL-Aufruf) ?
Keines der Protokolle werden aktualisiert, nach meinem Anruf, also nichts zu prüfen gibt. Ich habe keine änderungen an meiner app (die arbeiten) seit dem Wechsel von http zu https.
Hier ist der CN1-code aufrufen:
public String fetchTokenIntoStorage(String userName, String password) {
ConnectionRequest r = new ConnectionRequest();
r.setUrl(Constants.URL_HOST_PORT + "/MyProject" + Constants.LIVE_OR_TEST
+ "/v1/generate_token");
r.addRequestHeader("Content-Type", "application/json");
r.addRequestHeader("userName", userName);
r.addRequestHeader("password", password);
r.setHttpMethod("GET");
r.setFailSilently(false);
r.setPost(false);
//show spinning dialog while connecting
InfiniteProgress prog = new InfiniteProgress();
Dialog dlg = prog.showInifiniteBlocking();
r.setDisposeOnCompletion(dlg);
NetworkManager.getInstance().setTimeout(10000);
//NetworkManager.getInstance().addErrorListener(new ActionListener() {
//
//@Override
//public void actionPerformed(ActionEvent evt) {
//MessageBox.showDialogMessage("Unable to connect to server. Please
//retry later.");
//}
//});
//NetworkManager.getInstance().updateThreadCount(2);
NetworkManager.getInstance().addToQueueAndWait(r);
if (r.getResponseData() != null) {
JSONParser parser = new JSONParser();
Map<String, Object> json = null;
try {
json = parser.parseJSON(new InputStreamReader(new ByteArrayInputStream(r.getResponseData())));
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
if (json.get("error") != null) {
return String.valueOf(json.get("error"));
}
JwtRecord record = new JwtRecord();
record.userId = Integer.parseInt(String.valueOf(json.get("userId")));
record.jsonWebToken = (String) json.get("jwt");
record.theme = "LIGHT";
Storage.getInstance().writeObject("MyToken", record);
return "";
}
if (!r.getResponseErrorMessage().equalsIgnoreCase("")) {
return r.getResponseErrorMessage();
} else {
return "Unable to connect to server. Please check connection.";
}
}
Den code schrittweise Durchlaufen, es scheint nur Fehler nach
NetworkManager.getInstance().addToQueueAndWait(r);
R.getResponseData() und r -.getResponseErrorMessage() null sind.
Vielen Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies geschieht, wenn das signierende Autorität nicht anerkannt von der zugrunde liegenden JDK. Vorausgesetzt, Sie kaufte Ihr Zertifikat von einer gültigen Quelle es ist möglich, dass es verwendet eine relativ neue Wurzel, die bedeutet, dass Sie brauchen, um die neueste version von JDK 8.
E. g. letsencrypt wurde nur Hinzugefügt in JDK 8 update 101.
Es funktioniert jetzt.
(Auf cloud-tomcat) machte ich sicher, dass das root-Zertifikat und dem Vermittler-Zertifikat wurden in meinem keystore (nach den links, die ich bisher im Lieferumfang enthalten). Ich meine .ca-bundle in den Schlüsselspeicher für eine gute Maßnahme.
(Auf cloud-tomcat) Und ich bemerkte, dass ich mit einer älteren version des Apache-Konfiguration (Lektion darüber gelernt, unter Berufung auf ältere forum-Beiträge). Erforderlich, um die SSLCACertificateFile Hinweis auf mein .ca-bundle-Datei, anstatt SSCertificateChainFile, in meinem apache .conf-Datei.
Es immer noch Fehler auf meinem simulator funktioniert aber auf meinem iphone, die Punkte (wie Shai sagt) zu unterschiedlichen JDK ' s, die ich erwarte, so aktualisiert sich mein laptop auf die höhere JDK 1.8.171. Dies hat nicht in sich selbst einen Unterschied zu machen, aber wahrscheinlich erforderlich.
Durch Graben um, merkte ich, dass Simulatoren auf meinem laptop nötig, die oben genannten auch. So landete ich ausgeführt werden die Anweisungen unten, in der Eingabeaufforderung als Administrator, und jetzt ist mein simulator funktioniert.
cd %java_home%\jre\lib\security
path=%java_home\bin
keytool -import-alias comodo -keystore cacerts -Datei C:\path\ComodoRoot.cer
keytool -import-alias comodo_intermediate -keystore cacerts -Datei C:\path\ComodoInter.cer
keytool -import-alias purchased_cert -keystore cacerts -Datei C:\path\my_purchased_cert.crt