背景
我一直在自己的 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 是原因,因为问题代码在项目中的不同位置工作。
非常感谢任何关于错误的想法,我花了一天时间调试这个,但不知道下一步该去哪里。
谢谢。
然后我记得当我测试网络连接的 SSL 时,我设置了两个 VM 参数。
我删除了以下虚拟机参数来解决该问题:
-Djavax.net.ssl.keyStore=mySrvKeystore -Djavax.net.ssl.keyStorePassword=123456
注意:此密钥库不再存在,因此这可能就是异常的原因。
我更改了密钥库的密码以匹配我输入的密码(我不想更改我输入的密码),但它仍然给出相同的错误。
keytool -storepasswd -keystore keystore.jks
问题是我还需要更改密钥库中密钥的密码。
当我最初创建密钥库时,密钥是使用与密钥库相同的密码创建的(我接受了这个默认选项)。所以我还必须更改密钥的密码,如下所示:
keytool -keypasswd -alias my.alias -keystore keystore.jks
使用与私钥相同的密码创建密钥库后,问题得到解决。
事实证明 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
其中之一可能存在上述一些密钥库问题。
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
覆盖,无需进一步的凭据。
SSLContext sslContext = SSLContext.getInstance("SSL"); // or "SSL" depending on your requirements
sslContext.init(null, null, new SecureRandom());
((HttpsURLConnection) connection).setSSLSocketFactory(sslContext.getSocketFactory());