Java-无法通过网址

时间:2018-10-05 13:45:02

标签: java security ssl

我一直在寻找答案,无济于事。

那是我的代码:

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。尚无解决方案。

3 个答案:

答案 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) {
}