当前位置: 首页 > 知识库问答 >
问题:

Java SSL握手错误-Tomcat密钥库

惠凯歌
2023-03-14

我试图通过SSL连接(在我的独立应用程序和Tomcat提供的其他应用程序之间发送一些数据):

https://tomcat_server:8843/app

不幸的是,我的独立应用程序中出现了一个错误:

原因:javax。网ssl。例外:太阳。安全验证器。ValidatorException:PKIX路径生成失败:sun。安全供应商。certpath。SunCertPathBuilderException:无法在com上找到请求目标的有效证书路径。太阳网ssl。内部的ssl。警报。getSSLException(未知源)位于com。太阳网ssl。内部的ssl。SSLSocketImpl。com上出现致命(未知来源)。太阳网ssl。内部的ssl。握手。fatalSE(未知来源)位于com。太阳网ssl。内部的ssl。握手。fatalSE(未知来源)位于com。太阳网ssl。内部的ssl。ClientHandshaker。com上的服务器证书(未知源)。太阳网ssl。内部的ssl。ClientHandshaker。com上的processMessage(未知源)。太阳网ssl。内部的ssl。握手。com上的processLoop(未知源)。太阳网ssl。内部的ssl。握手。在com上处理_记录(未知来源)。太阳网ssl。内部的ssl。SSLSocketImpl。com上的readRecord(未知来源)。太阳网ssl。内部的ssl。SSLSocketImpl。com上的performInitialHandshake(未知来源)。太阳网ssl。内部的ssl。SSLSocketImpl。com上的writeRecord(未知来源)。太阳网ssl。内部的ssl。AppOutputStream。在java上编写(未知源代码)。伊奥。缓冲输出流。java上的flushBuffer(未知源)。伊奥。缓冲输出流。在组织上刷新(未知来源)。阿帕奇。平民httpclient。HttpConnection。flushRequestOutputStream(HttpConnection.java:827)位于org。阿帕奇。平民httpclient。多线程HttpConnectionManager$HttpConnectionAdapter。flushRequestOutputStream(多线程HttpConnectionManager.java:1525)位于org。阿帕奇。平民httpclient。HttpMethodBase。writeRequest(HttpMethodBase.java:1975)位于org。阿帕奇。平民httpclient。HttpMethodBase。在org上执行(HttpMethodBase.java:993)。阿帕奇。平民httpclient。HttpMethodDirector。executeWithRetry(HttpMethodDirector.java:397)位于org。阿帕奇。平民httpclient。HttpMethodDirector。executeMethod(HttpMethodDirector.java:170)位于org。阿帕奇。平民httpclient。HttpClient。executeMethod(HttpClient.java:396)位于org。阿帕奇。平民httpclient。HttpClient。executeMethod(HttpClient.java:324)位于org。阿帕奇。平民vfs。供应商。http。HttpClientFactory。createConnection(HttpClientFactory.java:101)。。。9更多

如果我将url定义为http,它可以正常工作:

http://tomcat_server:8080/app

我认为这也不是应用程序的问题。我在另一台Tomcat服务器上用同一个应用程序尝试了同样的方法,它通过https工作。这些服务器之间的唯一区别是,我没有在运行的服务器上创建密钥库文件(pfx)。我当然不能使用同一个密钥库,因为它的域不同(我也通过浏览器访问这个应用)。服务器上的Tomcat日志中没有任何内容。也许我在创建密钥库时做错了什么。

下面是我如何使用openssl工具和我的密钥、证书和中间证书生成密钥库文件的:

openssl pkcs12 -export -out certificate.pfx -inkey server.key -in server.crt -certfile intermediate.crt

以下是我的连接器配置:

protocol="org.apache.coyote.http11.Http11Protocol"
       port="8443" maxThreads="200"
       scheme="https" secure="true" SSLEnabled="true"
       keystoreFile="/path/to/keystore/certificate.pfx" keystorePass="changeit"  ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA"
       keystoreType="PKCS12" clientAuth="false" sslProtocol="TLS"/>

两个服务器都有相同的配置,所以我假设它必须是证书。有人知道怎么修吗?

共有3个答案

缪修德
2023-03-14

运行:openssl s_客户端-连接[working_server]:[working_port],然后对不工作的服务器执行同样的操作。比较结果;根据您的描述,它们之间可能没有共同的证书。“断开”服务器证书链中的一个证书必须在应用程序的信任库中才能工作(日志表明它们没有);您最好使用根证书,但在某些商业案例中,您可能更喜欢中间证书或叶证书本身。

孟海
2023-03-14

您的应用程序必须使用信任存储库,其中包含您添加到为8443指定的密钥存储库的证书的公共部分。这可以通过使用系统属性来完成:

-Djavax.net.ssl.trustStore=/path/to/truststore/truststore.jks
-Djavax.net.ssl.trustStorePassword=truststorepassword
拓拔谭三
2023-03-14

您需要在JDK安全中导入证书。按照下面的2步完成。

  • 步骤1转到java安全目录下

/path/to/java/jdk/jre/lib/security

  • 步骤2:在下面运行命令

keytool-import-keystore-cacerts-file/path/to/your/cert.cer

 类似资料:
  • 我正在go中运行https web服务器。我正在使用angular web应用程序(Chrome浏览器)对其进行测试,该应用程序可以对web服务器进行ajax调用。 如果我不断地点击网络服务器,一切似乎都正常。但每当我让它闲置一段时间并点击web服务器时,来自浏览器的ajax调用都不会得到响应。我几乎总是在服务器日志中看到此日志行。 我可以确认IP地址是我的IP地址。 我像这样启动我的https服

  • 笔记: 最初我试图从使用如下代码 代码1: 错误: 在谷歌搜索之后,我发现您已经使用了SSL验证,使用适配器会话可以解决这个问题。但我仍然有错误,请找到下面的代码和错误 代码2: 错误:

  • 问题内容: 我正在尝试连接到远程主机,并检查文件是否存在。在此阶段,我仅尝试连接,但是出现错误: 我试图找出其他人是否有像我一样的问题,但我却找不到。 我知道我需要在此过程中以某种方式检查knowns_hosts,但我只是想不通如何… 问题答案: 您在这里寻找的是: 然后将您的hostKey定义行替换为 有关此主题的更多信息: 我从中获取部分代码的官方样本 为什么现在需要hostKey 编辑:还请

  • 我正试图通过Java中的SSL套接字从客户端连接到服务器。客户端接收握手失败,服务器端没有共同的密码套件(www)。 服务器配置为SSL Tomcat 9,这里是连接器: 客户端是Java项目。密钥工具中双方都有证书。证书已从key工具导出,并在客户端通过key工具导入。因此,在客户端和服务器端,我们导入了server.cer.Tomcat在端口8443上启动,套接字使用端口443。 我尝试了什么

  • 我们有一个SSL问题,我是99%,这不是你通常的证书信任商店旋转木马。 我们有一个Weblogic服务器试图通过LDAPS与Active Directory建立SSL连接,底层SSL实现是JSSE。 有时,它是有效的。通常在重新启动Weblogic后的几个小时内。 之后,我们开始得到SSL握手错误,与SSL调试打开我们看到: [ACTIVE]ExecuteThread:'10'用于队列:'webl

  • 我试图为某些设备生成密钥时出错。我能够在运行4.4.2的三星Galaxy Note上重现错误。 我创建了一个小应用程序,只能通过从Android开发者页面“生成新私钥”下的https://developer.android.com/training/articles/keystore.html逐行复制代码来生成密钥 错误似乎发生在kpg.generateKeyPair(),在Android Key