我尝试通过SSL连接(发送一些数据)我的独立应用和Tomcat服务的其他应用:
https://tomcat_server:8843/app
不幸的是,我的独立应用中出现了错误:
引起:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到所请求目标的有效证书路径 at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source) at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source) 在com.sun.net.ssl.internal.ssl.Handshaker.processLoop(未知来源) at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(Unknown Source) at com.sun.net.ssl.internal.ssl.AppOutputStream.write(Unknown Source) 在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
我认为这也不是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"/>
两台服务器都有相同的配置,所以我认为它必须是证书。有谁知道如何解决它?
答案 0 :(得分:1)
您需要在JDK安全性中导入证书。按照以下2步完成。
/路径/到/ JAVA / JDK / JRE / lib / security中
keytool -import -keystore cacerts -file /path/to/your/cert.cer
答案 1 :(得分:0)
执行命令
openssl s_client -connect [working_server]:[working_port]
然后对不起作用的服务器执行相同的操作。比较结果;根据您的描述,它们之间可能没有共同的证书。 “破碎”中的证书之一服务器的证书链必须在您的应用程序的信任库中才能工作(日志表明它们不是);最好使用根证书,但有些业务案例可能更喜欢中间证书或叶证书本身。
答案 2 :(得分:0)
您的应用程序必须使用信任库,该信任库包含您添加到为8443指定的密钥库的证书的公共部分。这可以通过使用系统属性来完成:
-Djavax.net.ssl.trustStore=/path/to/truststore/truststore.jks
-Djavax.net.ssl.trustStorePassword=truststorepassword