java - Https / ssl post方法在开发人员机器上工作但在服务器上不起作用 - java
问题描述
大家好,我使用此代码连接 https 并且它在我的电脑上工作正常但是当我上传到我的服务器时不工作
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:1964)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:328)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:322)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1614)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:1052)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:987)
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 sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:263)
at mehritco.ir.connection.URLConnection.read(URLConnection.java:38)
at mehritco.ir.cortexclient.objects.invoice.Price.setExchangeRate(Price.java:42)
并且此日志文件不会显示在本地电脑上!
这是我连接到 https/ssl 的代码
public String readLinkInJson(String url, String data) throws MalformedURLException, IOException {
URL obj = new URL(url);
System.out.println(data);
HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
con.setHostnameVerifier(hv);
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
con.setRequestProperty("User-Agent", "Mozilla/5.0");
con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
con.setDoOutput(true);
// For POST only - START
try (OutputStream os = con.getOutputStream()) {
os.write(data.getBytes("UTF-8"));
os.flush();
}
// For POST only - END
String inputLine;
StringBuilder response = new StringBuilder();
int responseCode = con.getResponseCode();
if(responseCode >= 400){
try (BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()))) {
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
}
}else{
try (BufferedReader in = new BufferedReader(new InputStreamReader(con.getErrorStream()))) {
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
}
}
return response.toString();
}
那我该怎么办?请帮我找到正确的代码...
解决方案
我找到了答案!
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
}
};
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (GeneralSecurityException e) {
}
在制作 url 对象之前添加此代码。
推荐阅读
- c++ - 如何在模板容器类中实现复制构造函数和赋值运算符?
- sql - INNER JOIN 查询性能很慢
- python - 下载 twitter 视频的 flac 文件?
- c# - 如何使用实体框架获取模型以供 ViewModel 引用
- angular - 如何使用 Dialogflow V2 查询修复身份验证错误
- netsuite - Netsuite 计划脚本产生无法复制的意外错误
- cmd - 带有截断选项的 Windows CMD FTP
- php - 单击按钮时触发php的邮件功能
- android - 如何使导航图标在单击时打开下拉菜单?(安卓)
- python - 查找 2 个图像像素值的差异,然后根据差异创建新图像