Thi*_*art 5 rest ssl https tomcat codenameone
请你帮忙。我有一个 Codenameone 应用程序,它向云 Tomcat 8 服务器发出 GET 请求,并期望返回一些响应 JSON。重要的是,这是一个 HTTPS 调用。
当我在 Postman 中运行请求时,它工作正常:
https://www.mydomain.co.uk:8443/MyProject/v1/generate_token
通过我的浏览器可以使用相同的 URL,并显示为“安全”,并且我可以看到我的证书详细信息。我已经为我的 SSL/TLS 配置购买了证书,并且在启动时的日志中似乎运行良好。
在模拟器中,我在从 URL 调用读取响应时收到以下错误 - 我猜这必须是加密的:
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)
Run Code Online (Sandbox Code Playgroud)
为什么应用程序与进行调用的 Postman 有任何不同(网络监视器窗口确认相同的 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.";
}
}
Run Code Online (Sandbox Code Playgroud)
单步执行代码后似乎出现错误
NetworkManager.getInstance().addToQueueAndWait(r);
Run Code Online (Sandbox Code Playgroud)
r.getResponseData() 和 r.getResponseErrorMessage() 为空。
非常感谢
现在正在工作。
(在云 tomcat 上)我确保根证书和中间证书位于我的密钥库中(根据我之前包含的链接)。为了更好地衡量,我将我的 .ca-bundle 包含在密钥库中。
(在云 tomcat 上)我注意到我使用的是旧版本的 Apache 配置(关于依赖旧论坛帖子的经验教训)。需要让 SSLCACertificateFile 指向我的 .ca-bundle 文件,而不是在我的 apache .conf 文件中使用 SSCertificateChainFile。
它在我的模拟器上仍然出错,但在我的 iPhone 上可以运行,这表明(正如 Shai 所说)我期望的 JDK 不同,因此将我的笔记本电脑升级到更高的 JDK 1.8.171。这本身并没有什么区别,但可能是必需的。
通过深入研究,我意识到我的笔记本电脑上的模拟器也需要上述内容。所以我最终以管理员身份在命令提示符下运行了下面的语句,现在我的模拟器正在工作。
cd %java_home%\jre\lib\security
路径=%java_home\bin
keytool -import -alias comodo -keystore cacerts -文件 C:\path\ComodoRoot.cer
keytool -import -alias comodo_intermediate -keystore cacerts -文件 C:\path\ComodoInter.cer
keytool -import -alias buy_cert -keystore cacerts -文件 C:\path\my_purchased_cert.crt
| 归档时间: |
|
| 查看次数: |
57556 次 |
| 最近记录: |