Rest SunCertPathBuilderException:在CN1应用程序中找不到请求目标的有效证书路径
请你帮忙。 我有一个Codenameone应用程序,它向云Tomcat8服务器发出GET请求,并期望返回一些响应。重要的是,这是一个HTTPS呼叫 当我在Postman中运行请求时,它工作正常: 同一个URL通过我的浏览器工作并显示为“安全”,我可以看到我的证书详细信息。 我已经为我的SSL/TLS配置购买了一个证书,并且在启动时的日志中似乎运行良好 在模拟器中,我在从URL调用读取响应时返回以下错误-我猜必须对其进行加密:Rest SunCertPathBuilderException:在CN1应用程序中找不到请求目标的有效证书路径,rest,tomcat,ssl,https,codenameone,Rest,Tomcat,Ssl,Https,Codenameone,请你帮忙。 我有一个Codenameone应用程序,它向云Tomcat8服务器发出GET请求,并期望返回一些响应。重要的是,这是一个HTTPS呼叫 当我在Postman中运行请求时,它工作正常: 同一个URL通过我的浏览器工作并显示为“安全”,我可以看到我的证书详细信息。 我已经为我的SSL/TLS配置购买了一个证书,并且在启动时的日志中似乎运行良好 在模拟器中,我在从URL调用读取响应时返回以下错误-我猜必须对其进行加密: Exception: javax.net.ssl.SSLHandsh
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)
为什么应用程序与邮递员打电话有什么不同(网络监视器窗口确认相同的URL呼叫)
我打电话后没有更新任何日志,因此没有要检查的内容。自从从http移动到https后,我没有对我的应用程序做任何更改(该应用程序正在运行)
以下是拨打电话的CN1代码:
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.";
}
}
r.getResponseData()和r.getResponseErrorMessage()为空
非常感谢如果基础JDK无法识别签名权限,就会发生这种情况。假设您从有效的来源购买了证书,它可能使用了相对较新的根,这意味着您需要使用最新版本的JDK 8 例如,仅在JDK 8更新101中添加 它现在正在工作
刚刚检查了Tomcat及其运行的JDK1.8更新171,这似乎足够高了。确认我的cacerts确实包含我的根CA,所以不是这样。进一步阅读表明,它可以很好地使用“我的证书”层次结构中显示的中间证书。稍后我将把它添加到密钥库中。顺便说一句,我的密钥库不包含我的孩子证书(我买的那个),所以不知道这是否是一个问题?好消息:不幸的是,我仍然有同样的问题。有人能帮忙吗。我已成功地将根证书、中介和我自己的证书添加到密钥库中。我可以看到他们在那里。当我运行模拟器时,它仍然会出错。我读过很多论坛,都是空白。有我需要检查的地方吗?感谢模拟器中客户端JVM使用的是同一个JDK吗?这可能是因为安装了旧的JDK吗?您似乎已经通过导入证书解决了这个问题。我有一个类似的问题,并通过将Java8的版本从1.8.0_25-b17升级到1.8.0_241-b07来修复它。你知道你在运行什么版本吗?
NetworkManager.getInstance().addToQueueAndWait(r);