【发布时间】:2022-01-19 22:39:17
【问题描述】:
一段时间以来,我一直在尝试使用以下技术从互联网中提取数据:
问题
我以前从未遇到过数据提取问题。一切总是正常工作。但是,我突然开始收到以下错误:
java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
at java.base/javax.net.ssl.DefaultSSLSocketFactory.throwException(SSLSocketFactory.java:266)
at java.base/javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:273)
at java.base/sun.net.www.protocol.https.HttpsClient.createSocket(HttpsClient.java:420)
at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:162)
at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:497)
at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:600)
at java.base/sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:265)
at java.base/sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:379)
at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:189)
at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1232)
at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1120)
at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:175)
at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:142)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:859)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:829)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:366)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:353)
at com.plua.jsoupteste.JSoupTest.main(JSoupTest.java:13)
Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
at java.base/java.security.Provider$Service.newInstance(Provider.java:1900)
at java.base/sun.security.jca.GetInstance.getInstance(GetInstance.java:236)
at java.base/sun.security.jca.GetInstance.getInstance(GetInstance.java:164)
at java.base/javax.net.ssl.SSLContext.getInstance(SSLContext.java:184)
at java.base/javax.net.ssl.SSLContext.getDefault(SSLContext.java:110)
at java.base/javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:83)
at java.base/javax.net.ssl.HttpsURLConnection.getDefaultSSLSocketFactory(HttpsURLConnection.java:334)
at java.base/javax.net.ssl.HttpsURLConnection.<init>(HttpsURLConnection.java:291)
at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.<init>(HttpsURLConnectionImpl.java:81)
at java.base/sun.net.www.protocol.https.Handler.openConnection(Handler.java:62)
at java.base/sun.net.www.protocol.https.Handler.openConnection(Handler.java:57)
at java.base/java.net.URL.openConnection(URL.java:1101)
at org.jsoup.helper.HttpConnection$Response.createConnection(HttpConnection.java:1020)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:856)
... 4 more
Caused by: java.security.KeyManagementException: problem accessing trust store
at java.base/sun.security.ssl.SSLContextImpl$DefaultManagersHolder.<clinit>(SSLContextImpl.java:942)
at java.base/sun.security.ssl.SSLContextImpl$DefaultSSLContext.<init>(SSLContextImpl.java:1112)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:78)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
at java.base/java.security.Provider.newInstanceUtil(Provider.java:155)
at java.base/java.security.Provider$Service.newInstance(Provider.java:1893)
... 17 more
此错误是持续存在的,并且无论使用上面列出的任何技术(JSoup、HtmlUnit、java.net.http 等)都会显示。即使是如下所示的简单代码也会导致此问题(在示例中,JSoup 仅用于演示目的):
public static void main(String[] args) {
try {
Document doc = Jsoup.connect("https://en.wikipedia.org/").get();
System.out.println(doc.title());
Elements newsHeadlines = doc.select("#mp-itn b a");
for (Element headline : newsHeadlines) {
System.out.printf("%s\n\t%s",
headline.attr("title"), headline.absUrl("href"));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我完全意识到这是与证书、SSL 等有关的问题,很遗憾我无法自行解决。
问题是我从来没有弄乱过任何东西,任何文件,配置,或任何可能会影响应用程序正常工作的更改(至少,我不知道)。
期望的目标
我已经在互联网上寻找此类异常的解决方案,但我的案例有一个非常具体的细节:
我正在开发一个将在家用电脑上使用的应用程序,也就是说,这个数据提取应用程序将需要由不是程序员的普通人使用,例如朋友,家庭等。
我不确定是否在我的个人计算机上解决此证书问题(创建命令、应用 JVM 参数、提取和操作证书等),我必须在将分发应用程序的每台计算机上执行相同的操作to(这将是一场噩梦,在这种情况下完全不可行)。
总结:我希望能够开发一个从互联网上提取数据的应用程序,分发它,不需要做任何配置毕竟,将接收应用程序的计算机只需要安装 Java。
我正在使用 JavaFX 做的图形界面,这是我以前能够做到的。我的问题是提取数据,正是因为我总是遇到这个错误。
开发环境
- 面向 Java 开发人员的 Eclipse IDE 版本 2018-09 (4.9.0),构建 ID 20180917-1800
- JSoup 1.14.3
- JDK 16
- JRE 1.8.0_311
【问题讨论】:
-
当我搜索
java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)时,我在 Stackoveflow 上看到了很多帖子,这些帖子中没有包含任何可以让您进行进一步调试的数据吗? -
@fantaghirocco:除了这个被明确标识为信任库,而不是密钥库。 OP:你有 sysprops
javax.net.ssl.trustStore*设置吗?文件$JRE/lib/security/cacerts是否被修改、删除或无法访问?你能用keytool -list -cacerts和密码changeit读取那个文件吗?
标签: java ssl web-scraping jsoup htmlunit