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 参数的建议,但这对我不起作用。
我正在使用 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 参数的建议,但这对我不起作用。