我的Web应用程序和Web服务在同一个Tomcat容器运行。如果我不使用HTTPS,一切工作正常。 当我运行Web应用程序和Web服务都使用HTTPS,但我得到当Web应用程序试图调用Web服务出现SSLHandshakeException。
我创建了使用以下命令在本地自签名的证书文件
%JAVA_HOME%\bin\keytool -genkeypair -alias test1 -keyalg RSA -keystore c:/apps/test1.crt
一个名为test1.crt
证书文件夹中C:\apps
被创建。
现在,我想在Java密钥库导入该证书,用下面的命令
%JAVA_HOME%\bin\keytool -import -alias test1 -file c:/apps/test1.crt-keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
我收到以下错误 -
关键工具错误:java.lang.Exception的:该项目不是一个X.509证书
当我使用Tomcat中这个证书文件,下面的设置
<Connector port="8443"
maxHttpHeaderSize="8192"
maxThreads="150"
minSpareThreads="25"
maxSpareThreads="75"
enableLookups="false"
disableUploadTimeout="true"
acceptCount="100"
scheme="https"
secure="true"
clientAuth="false"
sslProtocol="TLS"
SSLEnabled="true"
URIEncoding="UTF-8"
keystorePass="changeit"
keystoreFile="C:/apps/test2.crt" />
我不是在服务器启动时得到任何错误。当我调用web服务与应用程序,我得到SSLHandshakeException
我已经加入了Java密钥存储在本地的自签名证书,下面的命令
%JAVA_HOME%/bin/keytool -genkeypair -alias test2 -keyalg RSA -validity 1000 -keysize 2048 -keystore %JAVA_HOME%/jre/lib/security/cacerts
证书已被添加,这是我下面的命令验证
JAVA_HOME%\bin\keytool -list -keystore %JAVA_HOME%/jre/lib/security/cacerts -storepass changeit
现在,我已出口从Java密钥库证书文件,下面的命令
%JAVA_HOME%/bin/keytool -export -alias test2 -keystore %JAVA_HOME%/jre/lib/security/cacerts -rfc -file C:/apps/test2.crt
一个名为test2.crt
证书文件夹中C:\apps
被创建。
当我使用Tomcat中这个证书文件,下面的设置
<Connector port="8443"
maxHttpHeaderSize="8192"
maxThreads="150"
minSpareThreads="25"
maxSpareThreads="75"
enableLookups="false"
disableUploadTimeout="true"
acceptCount="100"
scheme="https"
secure="true"
clientAuth="false"
sslProtocol="TLS"
SSLEnabled="true"
URIEncoding="UTF-8"
keystorePass="changeit"
keystoreFile="C:/apps/test2.crt" />
我提示以下错误:
在org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:491) java.lang.IllegalArgumentException异常:无效的密钥库格式所造成 在org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:114) 在org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:85) 在org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:224) 在org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1044) 在org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:540) 在org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:74) 在org.apache.catalina.connector.Connector.initInternal(Connector.java:932) ... 13个
java.io.IOException异常:无效的密钥库格式所造成 在sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:663) 在sun.security.provider.JavaKeyStore $ JKS.engineLoad(JavaKeyStore.java:56) 在sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224) 在sun.security.provider.JavaKeyStore $ DualFormatJKS.engineLoad(JavaKeyStore.java:70) 在java.security.KeyStore.load(KeyStore.java:1445) 在org.apache.tomcat.util.net.SSLUtilBase.getStore(SSLUtilBase.java:160)
虽然服务器开始,我可以用我的应用程序。但是,当我试图调用Web服务,我得到
这里是出现SSLHandshakeException的日志
嵌套的例外是: javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径建设失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到有效的认证路径请求的目标
错误:(org.apache.axis.AxisFault) - > [;嵌套的例外是: javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径建设失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到有效的认证路径请求的目标]
AxisFault 的faultcode:{http://schemas.xmlsoap.org/soap/envelope/} Server.userException faultSubcode: faultString:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径建设失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到有效的认证路径请求的目标 faultActor: faultNode: faultDetail: {} http://xml.apache.org/axis/堆栈跟踪:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径建设失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到有效的认证路径请求的目标
我想为Tomcat的keystoreFile是“%JAVA_HOME%/ JRE / lib / security中/ cacerts的”和而你没有表示任何密钥库becouse你加一个密钥到JRE共同密钥库,但它恰恰不正确使用“C: /apps/test2.crt”。
也尝试将服务器证书添加到信任库文件:
JAVA_HOME%\bin\keytool -import -v -trustcacerts -alias test2 -file C:/apps/test2.crt -keystore %JAVA_HOME%/jre/lib/security/cacerts -keypass changeit -storepass changeit