JSoup javax.net.ssl.SSLHandshakeException:未找到与 <url> 匹配的主题备用 DNS 名称

JSoup javax.net.ssl.SSLHandshakeException: No subject alternative DNS name matching <url> found

我正在使用 JSoup 来获取网站。

我用这条线进行抓取:

 Document doc = Jsoup.connect(urlString).get();

代码第一次工作正常 运行 我程序的每个实例。如果我再做一次获取,我最终会得到以下错误:

        javax.net.ssl.SSLHandshakeException: No subject alternative DNS name matching <domain> found.
    at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:128)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:321)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:264)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:259)
    at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.checkServerCerts(CertificateMessage.java:1329)
    at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.onConsumeCertificate(CertificateMessage.java:1204)
    at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.consume(CertificateMessage.java:1151)
    at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392)
    at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:444)
    at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:421)
    at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:178)
    at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:164)
    at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1152)
    at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1063)
    at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:402)
    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:730)
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:706)
    at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:299)
    at org.jsoup.helper.HttpConnection.get(HttpConnection.java:288)
    at net.joshuad.novaprice.scrapers.Scraper.getSellPrice(Scraper.java:149)
    at net.joshuad.novaprice.mtg.Pricer.getSellPrices(Pricer.java:20)
    at net.joshuad.novaprice.MainPanel.lambda(MainPanel.java:271)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.security.cert.CertificateException: No subject alternative DNS name matching starcitygames.com found.
    at java.base/sun.security.util.HostnameChecker.matchDNS(HostnameChecker.java:207)
    at java.base/sun.security.util.HostnameChecker.match(HostnameChecker.java:98)
    at java.base/sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:459)
    at java.base/sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:434)
    at java.base/sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:233)
    at java.base/sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:129)
    at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.checkServerCerts(CertificateMessage.java:1313)
    ... 21 more

有时我只能运行 获取一次。有时我可以 运行 它三四次。但最终它因上述错误而失败。一旦失败,它总是失败,直到 JVM 和我的程序重新启动。如果我重新启动 JVM 和程序,它就会再次运行。

我已经尝试引入时间延迟来查看问题是否是请求发出得太快,但这似乎并没有改变任何东西。我能够成功发出 1-4 个请求,然后事情变糟,直到我重新启动程序。请求之间有多少时间延迟并不重要。一旦以这种方式失败了一次,它将继续失败,直到我重新启动程序。

我的程序没有保留任何缓存信息。我所做的只是获取 URL 中的内容,读取并处理它,然后将其显示给用户。每个新的提取是(就我的程序而言)一个独立的事务。

我的程序格式非常简单。基本上是:

 //Build the UI
 //Wait for User Search Input
 //Figure out the URL for the user's request
 Document doc = Jsoup.connect(urlString).get();
 //Process the data, display it to the user
 //Repeat until window closed. 

关于如何解决这个问题有什么想法吗?

我正在 运行在 Oracle Java JDK 11.0.1.

上安装这个

我可以通过从 Java 11 SDK 升级到 Java 13 SDK 来解决这个问题。

我看到了尝试将 -Dcom.sun.jndi.ldap.object.disableEndpointIdentification=true 添加到 jvm 参数的建议,但这对我不起作用。