我一直在寻找答案,无济于事。
那是我的代码:
BufferedImage img1 = ImageIO.read(new File(dir1));
URL url = new URL(image_srcURL);
BufferedImage img2 =
ImageIO.read(url.openStream());
现在,当我尝试读取网址时,出现以下异常。
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:PKIX路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法执行 在以下位置找到到所需目标的有效认证路径 java.base / sun.security.ssl.Alerts.getSSLException(Alerts.java:198)在 java.base / sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1974) 在java.base / sun.security.ssl.Handshaker.fatalSE(Handshaker.java:345) 在java.base / sun.security.ssl.Handshaker.fatalSE(Handshaker.java:339) 在 java.base / sun.security.ssl.ClientHandshaker.checkServerCerts(ClientHandshaker.java:1968) 在 java.base / sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1777) 在 java.base / sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:264) 在 java.base / sun.security.ssl.Handshaker.processLoop(Handshaker.java:1098) 在 java.base / sun.security.ssl.Handshaker.processRecord(Handshaker.java:1026) 在 java.base / sun.security.ssl.SSLSocketImpl.processInputRecord(SSLSocketImpl.java:1137) 在 java.base / sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1074) 在 java.base / sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973) 在 java.base / sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1402) 在 java.base / sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1429) 在 java.base / sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413) 在 java.base / sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:567) 在 java.base / sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) 在 java.base / sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1581) 在 java.base / sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1509) 在 java.base / sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:245) 在 com.folderName.Tools.DataForAutomationV1.compareImg(DFA.java:606) 在 com.folderName.VendorTests.SettingsPage.editCompDets(SettingsPage.java:562) 在 com.folderName.VendorTests.SettingsPage.runTest(SettingsPage.java:62) 在com.folderName.Vendor.vendorTests(Vendor.java:36)处 com.folderName.Main.main(Main.java:40)由以下原因引起: sun.security.validator.ValidatorException:PKIX路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法执行 在以下位置找到到所需目标的有效认证路径 java.base / sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385) 在 java.base / sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:290) 在 java.base / sun.security.validator.Validator.validate(Validator.java:264) 在 java.base / sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:343) 在 java.base / sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:226) 在 java.base / sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:133) 在 java.base / sun.security.ssl.ClientHandshaker.checkServerCerts(ClientHandshaker.java:1947) ... 20更多原因: sun.security.provider.certpath.SunCertPathBuilderException:无法执行 在以下位置找到到所需目标的有效认证路径 java.base / sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) 在 java.base / sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) 在 java.base / java.security.cert.CertPathBuilder.build(CertPathBuilder.java:297) 在 java.base / sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380) ...另外26个
任何帮助都会很棒。 我正在尝试读取url中的图像并将其与现有文件进行比较。 这里没有任何问题可以给出答案。
编辑:
我尝试在命令行中输入“ keytool -list -keystore keystore”,但它只显示了TrustedCertEntries。尚无解决方案。
答案 0 :(得分:0)
首先,您需要获取服务器的证书,将其添加到Keystone文件中,或者添加到jre中的Java truststore或单独的文件中。如果要创建新的信任库,请确保为程序提供信任库
答案 1 :(得分:0)
下面是我如何实现它的一个示例。该代码将响应主体读取到awt BufferedImage
中,然后写入.jpg文件,然后将文件读取回字节数组,然后删除该文件。我确定我在SO方面找到了帮助,但是我没有方便的答案。我会尝试找到它,以便引用。希望对您有帮助!
**按照@Srikanthkumar在回答中提到的方式进行编辑,您还需要获取证书并将其添加到JVM的信任库中。您可以通过浏览器使用具有证书浏览工具的任何浏览器来获取它。
import java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;
import java.nio.file.Files;
import java.util.Base64;
import java.util.UUID;
import javax.imageio.ImageIO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Override
public String getImage(String productNumber) throws EcomWebException {
try {
BufferedImage image = ImageIO.read(url);
File file = new File(guid.toString() + ".jpg");
ImageIO.write(image, "jpg", file);
String base64ImageString = Base64.getEncoder().encodeToString(Files.readAllBytes(file.toPath()));
file.delete();
return base64ImageString;
} catch (Exception e) {
throw new EcomWebException(IMAGE_NOT_FOUND_MESSAGE + productNumber, e);
}
}
答案 2 :(得分:0)
this post中的以下代码片段可能会对您有所帮助:
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) {
}