Как эффективно использовать файл JKS из папки ресурсов IntelliJ? - PullRequest
0 голосов
/ 14 сентября 2018

Я разрабатываю проект Kotlin в IntelliJ, которому нужен доступ к веб-сайту с поддержкой HTTPS с помощью Jsoup.Тестирование выявило javax.net.ssl.SSLHandshakeException, поэтому я сохранил сертификат безопасности для сайта и создал файл JKS.Поскольку я не могу гарантировать, что JVM будет работать с возможным файлом JAR, я подумал, что лучше всего сохранить файл JKS в папке ресурсов и загрузить его в программу.Тем не менее, когда я проверяю эту функцию:

fun getHomePage(): Connection.Response {
    System.setProperty("javax.net.ssl.trustStore", "/resources/certificate.jks")
    return Jsoup.connect("https://www.something.com/")
            .method(Connection.Method.GET)
            .execute()
}

... Я все еще получаю следующую ошибку:

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 java.base/sun.security.ssl.Alerts.getSSLException(Alerts.java:198)
    at java.base/sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1974)
    at java.base/sun.security.ssl.Handshaker.fatalSE(Handshaker.java:345)
    at java.base/sun.security.ssl.Handshaker.fatalSE(Handshaker.java:339)
    at java.base/sun.security.ssl.ClientHandshaker.checkServerCerts(ClientHandshaker.java:1968)
    at java.base/sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1777)
    at java.base/sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:264)
    at java.base/sun.security.ssl.Handshaker.processLoop(Handshaker.java:1098)
    at java.base/sun.security.ssl.Handshaker.processRecord(Handshaker.java:1026)
    at java.base/sun.security.ssl.SSLSocketImpl.processInputRecord(SSLSocketImpl.java:1137)
    at java.base/sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1074)
    at java.base/sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)
    at java.base/sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1402)
    at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1429)
    at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
    at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:567)
    at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
    at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:163)
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:746)
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:722)
    at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:306)
[...]

Я предполагаю, что мне нужно что-то, кроме System.setProperty("javax.net.ssl.trustStore", "/resources/certificate.jks") (любезно предоставлено https://stackoverflow.com/a/7745706/990549) здесь. Я просто не знаю что.

...