Java NoSuchAlgorithmException - SunJSSE、sun.security.ssl.SSLContextImpl$DefaultSSLContext

问题描述 投票:0回答:7

背景

我一直在自己的 Eclipse 项目中使用 Authorize.net SDK。一切都运转良好。然后我需要将其添加到我的主项目中。我将依赖项添加到类路径中,并将其复制到我需要的代码块中。应该有效。

问题

长话短说,代码在我放置的地方不起作用。但是,当我将其直接带到项目中的 main 方法时,它就会起作用。

在不起作用的地方,我使用调试器单步执行代码,发现以下异常:

java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)

扔在:

HttpResponse httpResponse = httpClient.execute(httpPost);

注意:httpClient = 来自 Apache 的 DefaultHttpClient

我现在完全被难住了。不知道是什么导致了这个错误。在 Eclipse 中,这两个产品似乎都针对相同的 JRE。他们也都有httpclient-4.0.1.jar。请注意,有问题的项目还具有工作项目没有的一些其他依赖项{boneCP,guava,mysql_connector_java,protobuf}

我不认为额外的 jar 是原因,因为问题代码在项目中的不同位置工作。

非常感谢任何关于错误的想法,我花了一天时间调试这个,但不知道下一步该去哪里。

谢谢。

java exception httpclient
7个回答
53
投票
经过更多搜索后,我发现该错误可能与其他问题有关,如无效的密钥库、密码等。

然后我记得当我测试网络连接的 SSL 时,我设置了两个 VM 参数。

我删除了以下虚拟机参数来解决该问题:

-Djavax.net.ssl.keyStore=mySrvKeystore -Djavax.net.ssl.keyStorePassword=123456

注意:此密钥库不再存在,因此这可能就是异常的原因。


13
投票
我也遇到过类似的问题。就我而言,我输入的密钥库密码不正确。

我更改了密钥库的密码以匹配我输入的密码(我不想更改我输入的密码),但它仍然给出相同的错误。

keytool -storepasswd -keystore keystore.jks

问题是我还需要更改密钥库中密钥的密码。

当我最初创建密钥库时,密钥是使用与密钥库相同的密码创建的(我接受了这个默认选项)。所以我还必须更改密钥的密码,如下所示:

keytool -keypasswd -alias my.alias -keystore keystore.jks
    

4
投票
我也有类似的问题。问题出在密码上:密钥库和私钥使用了不同的密码。 (使用了KeyStore浏览器)

使用与私钥相同的密码创建密钥库后,问题得到解决。


2
投票
类似的问题 - 从 intellij 运行时有这个错误,从 maven 运行时没有。

事实证明 IntelliJ 在内部使用了错误的 java:

/usr/lib/jvm/java-1.11.0-openjdk-amd64/bin/java --version openjdk 11.0.12 2021-07-20
当 Maven 使用良好的 java 时:

/usr/local/buildtools/java/jdk11/bin/java --version openjdk 11.0.11 2021-08-03
其中之一可能存在上述一些密钥库问题。


0
投票
您可以通过编辑 JDK_HOME/jre/lib/security/java.security 来重新启用 MD2,从而尝试取消禁用 MD2。只需注释以下行:从 jdk.certpath.disabledAlgorithms=MD2 到 #jdk.certpath.disabledAlgorithms=MD2


0
投票
我使用

typesafe config 遇到了此错误消息。我注意到错误消息之前是这些日志消息:

javax.net.ssl|DEBUG|0A|pool-1-thread-1|2023-07-13 07:23:27.048 CEST|TrustStoreManager.java:161|Inaccessible trust store: /srv/truststore.jks javax.net.ssl|DEBUG|0A|pool-1-thread-1|2023-07-13 07:23:27.050 CEST|TrustStoreManager.java:112|trustStore is: /usr/lib/jvm/java-11-openjdk-amd64/lib/security/cacerts
因此,即使我在启动应用程序时使用了

-Djavax.net.ssl.trustStore=./truststore.jks

,它也不会粘住,并且应用程序尝试访问不同的信任库。解释是,
/srv/truststore.jks
是在reference.conf中配置的,覆盖了代码中系统属性的值,本地不存在,与我想要使用的不匹配。然后,Java 使用了默认的信任库,当然它没有正确的证书。

在应用程序启动时,reference.conf 可以被

-DtrustStore=./truststore.jks

 覆盖,无需进一步的凭据。


0
投票
我使用 HttpURLConnection 并看到错误 java.security.NoSuchAlgorithmException。我使用下面的代码并解决了问题。

SSLContext sslContext = SSLContext.getInstance("SSL"); // or "SSL" depending on your requirements sslContext.init(null, null, new SecureRandom()); ((HttpsURLConnection) connection).setSSLSocketFactory(sslContext.getSocketFactory());
    
© www.soinside.com 2019 - 2024. All rights reserved.