【问题标题】:Unable to extract data from the internet with any technology - java.net.SocketException: java.security.NoSuchAlgorithmException无法使用任何技术从 Internet 提取数据 - java.net.SocketException: java.security.NoSuchAlgorithmException
【发布时间】: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();
    }
}

Example Source

我完全意识到这是与证书、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


【解决方案1】:

您的 JVM 正在尝试建立加密连接。 然而,在协商使用哪种加密算法时,双方无法就双方都知道的算法达成一致,所以这就是他们失败的时候。

这可能意味着您的 JVM 允许的算法不好。这也可能意味着对方允许的算法不好。就是没有共同点。

尝试在双方安装最新的软件版本。检查 SSL 或加密设置以获取允许的密码。

【讨论】:

  • 这与 TLS-aka-SSL 有关,但不是协议协商,它在 SSLContext 构造函数期间尚未开始。 SSL truststore 设置可能是一个因素;更广泛的加密或更广泛的协议不是。
  • 你是对的。堆栈跟踪中最低的异常实际上提到了“java.security.KeyManagementException:访问信任库的问题”。我会尽快删除我的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 2017-10-25
  • 2021-11-13
  • 1970-01-01
  • 2013-10-23
  • 2019-08-24
相关资源
最近更新 更多