【发布时间】:2016-02-13 18:28:24
【问题描述】:
我尝试通过 SSL 连接(在它们之间发送一些数据)我的独立应用和 Tomcat 提供的其他应用:
https://tomcat_server:8843/app
很遗憾,我的独立应用程序中出现错误:
原因:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径 在 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(未知来源) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(未知来源) 在 com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(未知来源) 在 com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(未知来源) 在 com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(未知来源) 在 com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(未知来源) 在 com.sun.net.ssl.internal.ssl.Handshaker.processLoop(未知来源) 在 com.sun.net.ssl.internal.ssl.Handshaker.process_record(未知来源) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(未知来源) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(未知来源) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(未知来源) 在 com.sun.net.ssl.internal.ssl.AppOutputStream.write(未知来源) 在 java.io.BufferedOutputStream.flushBuffer(未知来源) 在 java.io.BufferedOutputStream.flush(未知来源) 在 org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:827) 在 org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.flushRequestOutputStream(MultiThreadedHttpConnectionManager.java:1525) 在 org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:1975) 在 org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:993) 在 org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:397) 在 org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170) 在 org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396) 在 org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:324) 在 org.apache.commons.vfs.provider.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"/>
两台服务器都有相同的配置,所以我认为它必须是证书。有人知道怎么解决吗?
【问题讨论】:
-
也许你需要应用端的证书文件。
-
@disable1992 正如我所写,同一个应用程序适用于第二个 Tomcat(不同的密钥库)。